src/tool_doswin.c | 57 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/src/tool_doswin.c b/src/tool_doswin.c index 38ef0a0..8e976e9 100644 --- a/src/tool_doswin.c +++ b/src/tool_doswin.c @@ -615,6 +615,37 @@ char **__crt0_glob_function(char *arg) * HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SafeProcessSearchMode */ +static BOOL check_file_exists(const TCHAR *filename) +{ + const DWORD attr = GetFileAttributes(filename); + return (attr != INVALID_FILE_ATTRIBUTES) && (!(attr & FILE_ATTRIBUTE_DIRECTORY)); +} + +static char *execpath(const TCHAR *filename) +{ + static const size_t BUFFSIZE = 512; + TCHAR filebuffer[BUFFSIZE]; + unsigned long len = GetModuleFileName(0, filebuffer, BUFFSIZE); + if((len > 0) && (len < BUFFSIZE)) { + TCHAR *lastdirchar = _tcsrchr(filebuffer, TEXT('\\')); + if(lastdirchar) { + *lastdirchar = TEXT('\0'); + } + if (_tcslen(filebuffer) + _tcslen(filename) + 2U < BUFFSIZE) { + _tcscat(filebuffer, TEXT("\\")); + _tcscat(filebuffer, filename); + if (check_file_exists(filebuffer)) { +#ifdef UNICODE + return curlx_convert_wchar_to_UTF8(filebuffer); +#else + return strdup(filebuffer); +#endif + } + } + } + return NULL; +} + CURLcode FindWin32CACert(struct OperationConfig *config, curl_sslbackend backend, const TCHAR *bundle_file) @@ -634,21 +665,9 @@ CURLcode FindWin32CACert(struct OperationConfig *config, */ if(feature_ssl && backend != CURLSSLBACKEND_SCHANNEL) { - DWORD res_len; - TCHAR buf[PATH_MAX]; - TCHAR *ptr = NULL; - - buf[0] = TEXT('\0'); - - res_len = SearchPath(NULL, bundle_file, NULL, PATH_MAX, buf, &ptr); - if(res_len > 0) { - char *mstr = curlx_convert_tchar_to_UTF8(buf); - Curl_safefree(config->cacert); - if(mstr) - config->cacert = strdup(mstr); - curlx_unicodefree(mstr); - if(!config->cacert) - result = CURLE_OUT_OF_MEMORY; + char *cacert = execpath(bundle_file); + if (cacert) { + config->cacert = cacert; } } #endif @@ -785,6 +804,8 @@ bool tool_isVistaOrGreater; CURLcode win32_init(void) { + size_t acmdln_len, wcmdln_len; + /* curlx_verify_windows_version must be called during init at least once because it has its own initialization routine. */ if(curlx_verify_windows_version(6, 0, 0, PLATFORM_WINNT, @@ -799,6 +820,12 @@ CURLcode win32_init(void) init_terminal(); #endif + SecureZeroMemory(_acmdln, acmdln_len = strlen(_acmdln) * sizeof(char)); + SecureZeroMemory(_wcmdln, wcmdln_len = wcslen(_wcmdln) * sizeof(wchar_t)); + + if (acmdln_len >= 4) strcpy(_acmdln, "curl"); + if (wcmdln_len >= 4) wcscpy(_wcmdln, L"curl"); + return CURLE_OK; }