Jason Edmeades : cmd: Fix 'if exist' with a directory\ as a parameter.

Alexandre Julliard julliard at winehq.org
Wed Aug 29 16:10:45 CDT 2018


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

Author: Jason Edmeades <us at edmeades.me.uk>
Date:   Mon Aug 27 20:41:52 2018 +0100

cmd: Fix 'if exist' with a directory\ as a parameter.

'if exists' takes a parameter which can be directory, directory\ or
directory\. for example, and should equate to true if the directory
exists. The syntax directory\ is explicitly rejected by FindFirstFile
and hence was not working - look for this specific case, and if found
append a '.'.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45506
Signed-off-by: Jason Edmeades <us at edmeades.me.uk>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/cmd/builtins.c                  |  9 ++++++++-
 programs/cmd/tests/test_builtins.cmd     | 20 ++++++++++++++++++++
 programs/cmd/tests/test_builtins.cmd.exp |  4 ++++
 3 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index cb4a7b9..25d5be1 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -2861,7 +2861,14 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList)
   }
   else if (!lstrcmpiW (condition, existW)) {
     WIN32_FIND_DATAW fd;
-    HANDLE hff = FindFirstFileW(WCMD_parameter(p, 1+negate, NULL, FALSE, FALSE), &fd);
+    HANDLE hff;
+    WCHAR *param = WCMD_parameter(p, 1+negate, NULL, FALSE, FALSE);
+    int    len = strlenW(param);
+
+    /* FindFirstFile does not like a directory path ending in '\', append a '.' */
+    if (len && param[len-1] == '\\') strcatW(param, dotW);
+
+    hff = FindFirstFileW(param, &fd);
     test = (hff != INVALID_HANDLE_VALUE );
     if (test) FindClose(hff);
 
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index 0e88ad1..b36afa4 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1046,6 +1046,26 @@ if exist idontexist\ba* (
 ) else (
    echo exist wildcard bad subdir broken works
 )
+if exist subdir (
+   echo exist subdir ok
+) else (
+   echo ERROR exist subdir not working
+)
+if exist subdir\. (
+   echo exist subdir with . ok
+) else (
+   echo ERROR exist subdir with . not working
+)
+if exist subdir\ (
+   echo exist subdir with \ ok
+) else (
+   echo ERROR exist subdir with \ not working
+)
+if exist "subdir\" (
+   echo exist subdir with \ and quotes ok
+) else (
+   echo ERROR exist subdir with \ and quotes not working
+)
 del foo subdir\bar
 rd subdir
 
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 1f2b5dd..764e454 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -783,6 +783,10 @@ exist simple wildcard works
 exist wildcard works
 negate exist wildcard works
 exist wildcard bad subdir broken works
+exist subdir ok
+exist subdir with . ok
+exist subdir with \ ok
+exist subdir with \ and quotes ok
 ------ for numbers
 negative numbers handled
 negative numbers handled




More information about the wine-cvs mailing list