Author: mjansen
Date: Wed Sep 21 19:34:42 2016
New Revision: 72763
URL:
http://svn.reactos.org/svn/reactos?rev=72763&view=rev
Log:
[CRT] Fix __getmainargs parsing for a commandline ending with spaces. Patch by Yaroslav
Veremenko CORE-9199 #comment Thanks, please re-test!
Modified:
trunk/reactos/sdk/lib/crt/misc/getargs.c
Modified: trunk/reactos/sdk/lib/crt/misc/getargs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/sdk/lib/crt/misc/getargs.c…
==============================================================================
--- trunk/reactos/sdk/lib/crt/misc/getargs.c [iso-8859-1] (original)
+++ trunk/reactos/sdk/lib/crt/misc/getargs.c [iso-8859-1] Wed Sep 21 19:34:42 2016
@@ -181,7 +181,7 @@
*/
void __getmainargs(int* argc, char*** argv, char*** env, int expand_wildcards, int*
new_mode)
{
- int i, doexpand, slashesAdded, escapedQuote, inQuotes, bufferIndex;
+ int i, doexpand, slashesAdded, escapedQuote, inQuotes, bufferIndex, anyLetter;
size_t len;
char* buffer;
@@ -190,6 +190,7 @@
i = 0;
doexpand = expand_wildcards;
escapedQuote = FALSE;
+ anyLetter = FALSE;
slashesAdded = 0;
inQuotes = 0;
bufferIndex = 0;
@@ -213,7 +214,11 @@
// Arguments are delimited by white space, which is either a space or a tab.
if (i >= len || ((_acmdln[i] == ' ' || _acmdln[i] == '\t')
&& !inQuotes))
{
- aexpand(strndup(buffer, bufferIndex), doexpand);
+ // Handle the case when empty spaces are in the end of the cmdline
+ if (anyLetter)
+ {
+ aexpand(strndup(buffer, bufferIndex), doexpand);
+ }
// Copy the last element from buffer and quit the loop
if (i >= len)
{
@@ -222,11 +227,14 @@
while (_acmdln[i] == ' ' || _acmdln[i] == '\t')
++i;
+ anyLetter = FALSE;
bufferIndex = 0;
slashesAdded = 0;
escapedQuote = FALSE;
continue;
}
+
+ anyLetter = TRUE;
if (_acmdln[i] == '\\')
{
@@ -307,7 +315,7 @@
void __wgetmainargs(int* argc, wchar_t*** wargv, wchar_t*** wenv,
int expand_wildcards, int* new_mode)
{
- int i, doexpand, slashesAdded, escapedQuote, inQuotes, bufferIndex;
+ int i, doexpand, slashesAdded, escapedQuote, inQuotes, bufferIndex, anyLetter;
size_t len;
wchar_t* buffer;
@@ -316,6 +324,7 @@
i = 0;
doexpand = expand_wildcards;
escapedQuote = FALSE;
+ anyLetter = TRUE;
slashesAdded = 0;
inQuotes = 0;
bufferIndex = 0;
@@ -339,7 +348,11 @@
// Arguments are delimited by white space, which is either a space or a tab.
if (i >= len || ((_wcmdln[i] == ' ' || _wcmdln[i] == '\t')
&& !inQuotes))
{
- wexpand(wcsndup(buffer, bufferIndex), doexpand);
+ // Handle the case when empty spaces are in the end of the cmdline
+ if (anyLetter)
+ {
+ wexpand(wcsndup(buffer, bufferIndex), doexpand);
+ }
// Copy the last element from buffer and quit the loop
if (i >= len)
{
@@ -348,11 +361,14 @@
while (_wcmdln[i] == ' ' || _wcmdln[i] == '\t')
++i;
+ anyLetter = FALSE;
bufferIndex = 0;
slashesAdded = 0;
escapedQuote = FALSE;
continue;
}
+
+ anyLetter = TRUE;
if (_wcmdln[i] == '\\')
{