diff options
author | Archangel_SDY <Archangel.SDY@gmail.com> | 2019-01-20 12:47:56 +0800 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2019-01-21 23:21:45 +0100 |
commit | ce6f73b912fd26789e57a399a9094847f8966331 (patch) | |
tree | 2ab2f32be7a8f92e0ebbe034d2cc5c6bcb245acb | |
parent | 458e898911cebad6eacfdf654b7bfd35d88bfdb1 (diff) | |
download | curl-ce6f73b912fd26789e57a399a9094847f8966331.tar.gz |
schannel: preserve original certificate path parameter
Fixes #3480
Closes #3487
-rw-r--r-- | lib/vtls/schannel.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/vtls/schannel.c b/lib/vtls/schannel.c index af22ecbb6..00f4d7eb3 100644 --- a/lib/vtls/schannel.c +++ b/lib/vtls/schannel.c @@ -356,6 +356,7 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path, TCHAR **thumbprint) { TCHAR *sep; + TCHAR *store_path_start; size_t store_name_len; sep = _tcschr(path, TEXT('\\')); @@ -386,13 +387,17 @@ get_cert_location(TCHAR *path, DWORD *store_name, TCHAR **store_path, else return CURLE_SSL_CERTPROBLEM; - *store_path = sep + 1; + store_path_start = sep + 1; - sep = _tcschr(*store_path, TEXT('\\')); + sep = _tcschr(store_path_start, TEXT('\\')); if(sep == NULL) return CURLE_SSL_CERTPROBLEM; - *sep = 0; + *sep = TEXT('\0'); + *store_path = _tcsdup(store_path_start); + *sep = TEXT('\\'); + if(*store_path == NULL) + return CURLE_OUT_OF_MEMORY; *thumbprint = sep + 1; if(_tcslen(*thumbprint) != CERT_THUMBPRINT_STR_LEN) @@ -608,9 +613,11 @@ schannel_connect_step1(struct connectdata *conn, int sockindex) failf(data, "schannel: Failed to open cert store %x %s, " "last error is %x", cert_store_name, cert_store_path, GetLastError()); + free(cert_store_path); Curl_unicodefree(cert_path); return CURLE_SSL_CERTPROBLEM; } + free(cert_store_path); cert_thumbprint.pbData = cert_thumbprint_data; cert_thumbprint.cbData = CERT_THUMBPRINT_DATA_LEN; |