summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArchangel_SDY <Archangel.SDY@gmail.com>2019-01-20 12:47:56 +0800
committerDaniel Stenberg <daniel@haxx.se>2019-01-21 23:21:45 +0100
commitce6f73b912fd26789e57a399a9094847f8966331 (patch)
tree2ab2f32be7a8f92e0ebbe034d2cc5c6bcb245acb
parent458e898911cebad6eacfdf654b7bfd35d88bfdb1 (diff)
downloadcurl-ce6f73b912fd26789e57a399a9094847f8966331.tar.gz
schannel: preserve original certificate path parameter
Fixes #3480 Closes #3487
-rw-r--r--lib/vtls/schannel.c13
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;