[CRT] Always initialize _[w]pgmptr with a *FULL* path to the current application.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 5 Jun 2018 21:50:11 +0000 (23:50 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 5 Jun 2018 21:55:46 +0000 (23:55 +0200)
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!

CORE-12931 CORE-13892 CORE-13898 CORE-14066

sdk/lib/crt/misc/getargs.c

index 1a8cf0f..8644834 100644 (file)
@@ -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);
 }