mirror of
https://github.com/reactos/reactos.git
synced 2025-07-28 03:52:17 +00:00
[CRT]
Use a temporary buffer to parse the program's arguments, instead of using (and thus overwriting) the _a/wcmdln variable. Fix msvcrt_apitest:CommandLine test. CORE-6717 #comment Fixed in revision r57536. #resolve svn path=/trunk/; revision=57536
This commit is contained in:
parent
79ff1e973a
commit
1c4b5304f6
1 changed files with 29 additions and 16 deletions
|
@ -183,6 +183,7 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
|
||||||
{
|
{
|
||||||
int i, afterlastspace, ignorespace, doexpand;
|
int i, afterlastspace, ignorespace, doexpand;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
char* aNewCmdln;
|
||||||
|
|
||||||
/* missing threading init */
|
/* missing threading init */
|
||||||
|
|
||||||
|
@ -203,10 +204,12 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
|
||||||
|
|
||||||
len = strlen(_acmdln);
|
len = strlen(_acmdln);
|
||||||
|
|
||||||
|
/* Allocate a temporary buffer to be used instead of the original _acmdln parameter. */
|
||||||
|
aNewCmdln = strndup(_acmdln, len);
|
||||||
|
|
||||||
while (_acmdln[i])
|
while (aNewCmdln[i])
|
||||||
{
|
{
|
||||||
if (_acmdln[i] == '"')
|
if (aNewCmdln[i] == '"')
|
||||||
{
|
{
|
||||||
if(ignorespace)
|
if(ignorespace)
|
||||||
{
|
{
|
||||||
|
@ -217,16 +220,16 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
|
||||||
ignorespace = 1;
|
ignorespace = 1;
|
||||||
doexpand = 0;
|
doexpand = 0;
|
||||||
}
|
}
|
||||||
memmove(_acmdln + i, _acmdln + i + 1, len - i);
|
memmove(aNewCmdln + i, aNewCmdln + i + 1, len - i);
|
||||||
len--;
|
len--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_acmdln[i] == ' ' && !ignorespace)
|
if (aNewCmdln[i] == ' ' && !ignorespace)
|
||||||
{
|
{
|
||||||
aexpand(strndup(_acmdln + afterlastspace, i - afterlastspace), doexpand);
|
aexpand(strndup(aNewCmdln + afterlastspace, i - afterlastspace), doexpand);
|
||||||
i++;
|
i++;
|
||||||
while (_acmdln[i]==' ')
|
while (aNewCmdln[i] == ' ')
|
||||||
i++;
|
i++;
|
||||||
afterlastspace=i;
|
afterlastspace=i;
|
||||||
doexpand = expand_wildcards;
|
doexpand = expand_wildcards;
|
||||||
|
@ -237,11 +240,14 @@ void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_acmdln[afterlastspace] != 0)
|
if (aNewCmdln[afterlastspace] != 0)
|
||||||
{
|
{
|
||||||
aexpand(strndup(_acmdln+afterlastspace, i - afterlastspace), doexpand);
|
aexpand(strndup(aNewCmdln + afterlastspace, i - afterlastspace), doexpand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free the temporary buffer. */
|
||||||
|
free(aNewCmdln);
|
||||||
|
|
||||||
HeapValidate(GetProcessHeap(), 0, NULL);
|
HeapValidate(GetProcessHeap(), 0, NULL);
|
||||||
|
|
||||||
*argc = __argc;
|
*argc = __argc;
|
||||||
|
@ -265,6 +271,7 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
||||||
{
|
{
|
||||||
int i, afterlastspace, ignorespace, doexpand;
|
int i, afterlastspace, ignorespace, doexpand;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
wchar_t* wNewCmdln;
|
||||||
|
|
||||||
/* missing threading init */
|
/* missing threading init */
|
||||||
|
|
||||||
|
@ -285,9 +292,12 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
||||||
|
|
||||||
len = wcslen(_wcmdln);
|
len = wcslen(_wcmdln);
|
||||||
|
|
||||||
while (_wcmdln[i])
|
/* Allocate a temporary buffer to be used instead of the original _wcmdln parameter. */
|
||||||
|
wNewCmdln = wcsndup(_wcmdln, len);
|
||||||
|
|
||||||
|
while (wNewCmdln[i])
|
||||||
{
|
{
|
||||||
if (_wcmdln[i] == L'"')
|
if (wNewCmdln[i] == L'"')
|
||||||
{
|
{
|
||||||
if(ignorespace)
|
if(ignorespace)
|
||||||
{
|
{
|
||||||
|
@ -298,16 +308,16 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
||||||
ignorespace = 1;
|
ignorespace = 1;
|
||||||
doexpand = 0;
|
doexpand = 0;
|
||||||
}
|
}
|
||||||
memmove(_wcmdln + i, _wcmdln + i + 1, (len - i) * sizeof(wchar_t));
|
memmove(wNewCmdln + i, wNewCmdln + i + 1, (len - i) * sizeof(wchar_t));
|
||||||
len--;
|
len--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_wcmdln[i] == L' ' && !ignorespace)
|
if (wNewCmdln[i] == L' ' && !ignorespace)
|
||||||
{
|
{
|
||||||
wexpand(wcsndup(_wcmdln + afterlastspace, i - afterlastspace), doexpand);
|
wexpand(wcsndup(wNewCmdln + afterlastspace, i - afterlastspace), doexpand);
|
||||||
i++;
|
i++;
|
||||||
while (_wcmdln[i]==L' ')
|
while (wNewCmdln[i] == L' ')
|
||||||
i++;
|
i++;
|
||||||
afterlastspace=i;
|
afterlastspace=i;
|
||||||
doexpand = expand_wildcards;
|
doexpand = expand_wildcards;
|
||||||
|
@ -318,11 +328,14 @@ void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_wcmdln[afterlastspace] != 0)
|
if (wNewCmdln[afterlastspace] != 0)
|
||||||
{
|
{
|
||||||
wexpand(wcsndup(_wcmdln+afterlastspace, i - afterlastspace), doexpand);
|
wexpand(wcsndup(wNewCmdln + afterlastspace, i - afterlastspace), doexpand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free the temporary buffer. */
|
||||||
|
free(wNewCmdln);
|
||||||
|
|
||||||
HeapValidate(GetProcessHeap(), 0, NULL);
|
HeapValidate(GetProcessHeap(), 0, NULL);
|
||||||
|
|
||||||
*argc = __argc;
|
*argc = __argc;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue