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

Jason Edmeades us at edmeades.me.uk
Mon Aug 27 14:41:51 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 5026f9c1a5..cb4a7b901c 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -2073,7 +2073,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 0738f2da6e..0e88ad14fa 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -1724,9 +1724,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 7ec83d7acb..1f2b5dd8de 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -1209,6 +1209,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