Jason Edmeades : cmd: Support "c:<space>" etc when changing drive letters.
Alexandre Julliard
julliard at winehq.org
Thu Sep 13 03:49:15 CDT 2018
Module: wine
Branch: stable
Commit: 101fc687335df5fd695055d818082958197ca2ab
URL: https://source.winehq.org/git/wine.git/?a=commit;h=101fc687335df5fd695055d818082958197ca2ab
Author: Jason Edmeades <us at edmeades.me.uk>
Date: Wed Jul 4 22:08:38 2018 +0100
cmd: Support "c:<space>" etc when changing drive letters.
This allows whitespace and any other text on the line when changing drive letters.
Mostly I expect it crops up when commands are concatenated and the readability
whitespace is added to the end of the command. For example C: & dir results in
"C: " and "dir" as the two commands. We cannot unconditionally remove whitespace
as some commands rely on it.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=40694
Signed-off-by: Jason Edmeades <us at edmeades.me.uk>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit daee8b753c52011d1dd745e399cbe25ac9e9ac47)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
programs/cmd/tests/test_builtins.cmd | 35 ++++++++++++++++++++++++++++++++
programs/cmd/tests/test_builtins.cmd.exp | 7 +++++++
programs/cmd/wcmdmain.c | 9 ++++++--
3 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 63ec3ca..d060ba0 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -2992,6 +2992,41 @@ echo ------------ Testing start /W ------------
echo start /W failed to wait>foobar.txt
start /W "" cmd /C "ping -n1 & echo start /W seems to really wait>foobar.txt"& type foobar.txt& del foobar.txt
+echo ------------ Testing changing the drive letter ----------
+pushd C:\
+
+echo Normal:
+call :setError 0
+C:
+if errorlevel 1 echo Normal drive change failed
+
+echo Normal+space
+call :setError 0
+C:@space@
+if errorlevel 1 echo Normal+space drive change failed
+
+echo Normal+space+garbage
+call :setError 0
+C: garbage
+if errorlevel 1 echo Normal+space+garbage drive change failed
+
+call :setError 0
+echo Quoted should fail
+"C:"
+if not errorlevel 1 echo quoted drive change unexpectedly worked
+
+echo Normal+tab
+call :setError 0
+C:@tab@
+if errorlevel 1 echo Normal+tab drive change failed
+
+echo Normal+tab+garbage
+call :setError 0
+C:@tab at garbagetab
+if errorlevel 1 echo Normal+tab+garbage drive change failed
+
+popd
+
echo ------------ Testing combined CALLs/GOTOs ------------
echo @echo off>foo.cmd
echo goto :eof>>foot.cmd
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index dcc9629..e2b94af 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -1576,6 +1576,13 @@ PATH=try2
PATH=try3
------------ Testing start /W ------------
start /W seems to really wait
+------------ Testing changing the drive letter ----------
+Normal:
+Normal+space
+Normal+space+garbage
+Quoted should fail
+Normal+tab
+Normal+tab+garbage
------------ Testing combined CALLs/GOTOs ------------
world
cheball
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 827ddd2..0d02f1f 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -1327,13 +1327,18 @@ void WCMD_execute (const WCHAR *command, const WCHAR *redirects,
cmd = new_cmd;
/*
- * Changing default drive has to be handled as a special case.
+ * Changing default drive has to be handled as a special case, anything
+ * else if it exists after whitespace is ignored
*/
- if ((strlenW(cmd) == 2) && (cmd[1] == ':') && IsCharAlphaW(cmd[0])) {
+ if ((cmd[1] == ':') && IsCharAlphaW(cmd[0]) &&
+ (!cmd[2] || cmd[2] == ' ' || cmd[2] == '\t')) {
WCHAR envvar[5];
WCHAR dir[MAX_PATH];
+ /* Ignore potential garbage on the same line */
+ cmd[2]=0x00;
+
/* According to MSDN CreateProcess docs, special env vars record
the current directory on each drive, in the form =C:
so see if one specified, and if so go back to it */
More information about the wine-cvs
mailing list