From a863a979c5c9e6075d087e5bd66f931a08953ccf Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Mon, 24 Aug 2015 00:48:06 +0100 Subject: [PATCH 17/N] dcrt0.cc (globify): Don't quote literal strings differently when dos_spec Reverts 25ba8f306f3099caf8397859019e936b90510e8d. I can't figure out what the intention was. I'm sure I'll find out soon enough when everything breaks. This change means that input of: '"C:/test.exe SOME_VAR=\"literal quotes\""' becomes: 'C:/test.exe SOME_VAR="literal quotes"' instead of: 'C:/test.exe SOME_VAR=\literal quotes\' .. which is at least consistent with the result for: '"no_drive_or_colon SOME_VAR=\"literal quotes\""' The old result of course resulted in the quoted string being split into two arguments at the space which is clearly not intended. I *guess* backslashes in dos paths may have been the issue here? If so I don't care since we should not use them, ever, esp. not at the expense of sensible forward-slash-containing input. --- winsup/cygwin/dcrt0.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 8fc3672..3a2d0ec 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -237,10 +237,20 @@ globify (char *word, char **&argv, int &argc, int &argvlen) while (*++s && *s != quote) { mbstate_t mbs = { 0 }; + /* This used to be: if (dos_spec || *s != '\\') - /* nothing */; + // nothing else if (s[1] == quote || s[1] == '\\') s++; + With commit message: + dcrt0.cc (globify): Don't use \ quoting when apparently quoting a DOS path + spec, even within a quoted string. + But that breaks the "literal quotes" part of '"C:/test.exe SOME_VAR=\"literal quotes\""' + giving: 'C:/test.exe SOME_VAR=\literal quotes\' (with \'s between each character) + instead of 'C:/test.exe SOME_VAR="literal quotes"' (with \'s between each character) + */ + if (*s == '\\' && (s[1] == quote || s[1] == '\\')) + s++; *p++ = '\\'; size_t cnt = isascii (*s) ? 1 : mbrtowi (NULL, s, MB_CUR_MAX, &mbs); if (cnt <= 1 || cnt == (size_t)-1)