From 08ac11d2dae39d37abae7f6d4d24dff8ea2fd68d Mon Sep 17 00:00:00 2001 From: Joachim Henze Date: Fri, 7 Oct 2022 03:47:27 +0200 Subject: [PATCH] [0.4.7][CRT] Always initialize _[w]pgmptr with a *FULL* path to the current application CORE-12931 Otherwise fall back to the computed argv[0]. This is expected by some applications, for example Git. Code is adapted from Wine. Many thanks to Stanislav Motylkov for having investigated this bug! fixes CORE-12931 and all its duplicates: CORE-13892 CORE-13898 CORE-14066 Fix picked from 0.4.10-dev-201-g f215f394d803c98e1c1c5f0768159f3336b7e552 --- sdk/lib/crt/misc/getargs.c | 39 +++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/sdk/lib/crt/misc/getargs.c b/sdk/lib/crt/misc/getargs.c index 1a8cf0fb9eb..86448347baa 100644 --- a/sdk/lib/crt/misc/getargs.c +++ b/sdk/lib/crt/misc/getargs.c @@ -208,7 +208,7 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i len = strlen(_acmdln); buffer = malloc(sizeof(char) * len); - // Reference: https://msdn.microsoft.com/en-us/library/a1y7w461(v=vs.71).aspx + // Reference: https://msdn.microsoft.com/en-us/library/a1y7w461.aspx while (TRUE) { // Arguments are delimited by white space, which is either a space or a tab. @@ -294,7 +294,6 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i /* Free the temporary buffer. */ free(buffer); - HeapValidate(GetProcessHeap(), 0, NULL); *argc = __argc; if (__argv == NULL) @@ -304,7 +303,21 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i } *argv = __argv; *env = _environ; - _pgmptr = _strdup(__argv[0]); + + _pgmptr = malloc(MAX_PATH * sizeof(char)); + if (_pgmptr) + { + if (!GetModuleFileNameA(NULL, _pgmptr, MAX_PATH)) + _pgmptr[0] = '\0'; + else + _pgmptr[MAX_PATH - 1] = '\0'; + } + else + { + _pgmptr = _strdup(__argv[0]); + } + + HeapValidate(GetProcessHeap(), 0, NULL); // if (new_mode) _set_new_mode(*new_mode); } @@ -342,7 +355,7 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv, len = wcslen(_wcmdln); buffer = malloc(sizeof(wchar_t) * len); - // Reference: https://msdn.microsoft.com/en-us/library/a1y7w461(v=vs.71).aspx + // Reference: https://msdn.microsoft.com/en-us/library/a1y7w461.aspx while (TRUE) { // Arguments are delimited by white space, which is either a space or a tab. @@ -429,8 +442,6 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv, /* Free the temporary buffer. */ free(buffer); - HeapValidate(GetProcessHeap(), 0, NULL); - *argc = __argc; if (__wargv == NULL) { @@ -439,7 +450,21 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv, } *wargv = __wargv; *wenv = __winitenv; - _wpgmptr = _wcsdup(__wargv[0]); + + _wpgmptr = malloc(MAX_PATH * sizeof(wchar_t)); + if (_wpgmptr) + { + if (!GetModuleFileNameW(NULL, _wpgmptr, MAX_PATH)) + _wpgmptr[0] = '\0'; + else + _wpgmptr[MAX_PATH - 1] = '\0'; + } + else + { + _wpgmptr = _wcsdup(__wargv[0]); + } + + HeapValidate(GetProcessHeap(), 0, NULL); // if (new_mode) _set_new_mode(*new_mode); }