https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f215f394d803c98e1c1c5…
commit f215f394d803c98e1c1c5f0768159f3336b7e552
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Tue Jun 5 23:50:11 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Tue Jun 5 23:55:46 2018 +0200
[CRT] Always initialize _[w]pgmptr with a *FULL* path to the current application.
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 | 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 1a8cf0fb9e..86448347ba 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);
}