Jason Edmeades : cmd: Support "c:<space>" etc when changing drive letters.

Alexandre Julliard julliard at winehq.org
Thu Jul 5 15:25:53 CDT 2018


Module: wine
Branch: master
Commit: daee8b753c52011d1dd745e399cbe25ac9e9ac47
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=daee8b753c52011d1dd745e399cbe25ac9e9ac47

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>

---

 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 6f2ef4a..49c2d9e 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -3042,6 +3042,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 0eb5b96..cfde83b 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -1588,6 +1588,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