This corresponds to https://github.com/msys2/msys2-runtime/pull/313 Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
58 lines
2.2 KiB
Diff
58 lines
2.2 KiB
Diff
From a863a979c5c9e6075d087e5bd66f931a08953ccf Mon Sep 17 00:00:00 2001
|
|
From: Ray Donnelly <mingw.android@gmail.com>
|
|
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)
|