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