From bc9d68bcbee5c9d4f4582f766a4f552870385361 Mon Sep 17 00:00:00 2001 From: Jason Edmeades Date: Mon, 27 Aug 2018 20:41:52 +0100 Subject: [PATCH] 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 Signed-off-by: Alexandre Julliard --- 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 cb4a7b901c4..25d5be145e8 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 0e88ad14fa5..b36afa42290 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 1f2b5dd8dee..764e4546fb1 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