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
len = strlen(_acmdln);
buffer = malloc(sizeof(char) * len);
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.
while (TRUE)
{
// Arguments are delimited by white space, which is either a space or a tab.
/* Free the temporary buffer. */
free(buffer);
/* Free the temporary buffer. */
free(buffer);
- HeapValidate(GetProcessHeap(), 0, NULL);
*argc = __argc;
if (__argv == NULL)
*argc = __argc;
if (__argv == NULL)
}
*argv = __argv;
*env = _environ;
}
*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);
}
// if (new_mode) _set_new_mode(*new_mode);
}
len = wcslen(_wcmdln);
buffer = malloc(sizeof(wchar_t) * len);
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.
while (TRUE)
{
// Arguments are delimited by white space, which is either a space or a tab.
/* Free the temporary buffer. */
free(buffer);
/* Free the temporary buffer. */
free(buffer);
- HeapValidate(GetProcessHeap(), 0, NULL);
-
*argc = __argc;
if (__wargv == NULL)
{
*argc = __argc;
if (__wargv == NULL)
{
}
*wargv = __wargv;
*wenv = __winitenv;
}
*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);
}
// if (new_mode) _set_new_mode(*new_mode);
}