[PATCH 3/5] [programs\cmd] for /f fails to launch quoted program plus args

Jason Edmeades us at edmeades.me.uk
Sun Aug 5 17:15:28 CDT 2018

Fixes bug#39906

for /f can run a program and parse its output. The program name can supply args and be quoted or not.
If quoted, wine fails to run the program because internally we were adding an extra pair of quotes. These
are not needed and can be removed.

Signed-off-by: Jason Edmeades <us at edmeades.me.uk>
 programs/cmd/builtins.c                  | 2 +-
 programs/cmd/tests/test_builtins.cmd     | 4 +++-
 programs/cmd/tests/test_builtins.cmd.exp | 2 ++
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index f2a92c1a20..133ee53df2 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -2081,7 +2081,7 @@ static HANDLE WCMD_forf_getinputhandle(BOOL usebackq, WCHAR *itemstr, BOOL iscmd
   static const WCHAR redirOutW[]  = {'>','%','s','\0'};
   static const WCHAR cmdW[]       = {'C','M','D','\0'};
   static const WCHAR cmdslashcW[] = {'C','M','D','.','E','X','E',' ',
-                                     '/','C',' ','"','%','s','"','\0'};
+                                     '/','C',' ','%','s','\0'};
   /* Remove leading and trailing character */
   if ((iscmd && (itemstr[0] == '`' && usebackq)) ||
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index d794805b71..b838485f45 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1707,9 +1707,11 @@ if "%CD%"=="" goto :SkipFORFcmdNT4
 for /f %%i in ('echo.Passed1') do echo %%i
 for /f "usebackq" %%i in (`echo.Passed2`) do echo %%i
 for /f usebackq %%i in (`echo.Passed3`) do echo %%i
+for /f "usebackq" %%i in (`"c:\windows\system32\cmd.exe" /C echo Passed4`) do echo %%i
+for /f "usebackq" %%i in (`""c:\windows\system32\cmd.exe" /C echo Passed5"`) do echo %%i
 goto :ContinueFORF
-for /l %%i in (1,1,3) do echo Missing functionality - Broken%%i
+for /l %%i in (1,1,5) do echo Missing functionality - Broken%%i
 rem FIXME: Rest not testable right now in wine: not implemented and would need
 rem preliminary grep-like program implementation (e.g. like findstr or fc) even
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 9e77e98c25..ffdd316cb6 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -1206,6 +1206,8 @@ c
 Passed1 at or_broken@Missing functionality - Broken1
 Passed2 at or_broken@Missing functionality - Broken2
 Passed3 at or_broken@Missing functionality - Broken3
+Passed4 at or_broken@Missing functionality - Broken4
+Passed5 at or_broken@Missing functionality - Broken5
 ------ eol option
 and at or_broken@Broken NT4 functionality1
 Line at or_broken@Broken NT4 functionality2

More information about the wine-devel mailing list