[PATCH v3 0/2] MR9946: start: Remove quotes from the path specified by '/d'.
I'm not sure how to write a test case for this bug, as it involves creating a child process and I don't know how to verify if the child process was created correctly. Please test manually: enter `start /d "c:\windows" regedit.exe` in a batch file. It won't work correctly because `start` wraps the directory specified by `/D` with `L"\"\\\""` and `L"\\\"\""`. -- v3: start: Remove quotes from the path specified by '/d'. https://gitlab.winehq.org/wine/wine/-/merge_requests/9946
From: YeshunYe <yeyeshun@uniontech.com> Signed-off-by: YeshunYe <yeyeshun@uniontech.com> --- programs/cmd/tests/test_builtins.bat | 5 +++++ programs/cmd/tests/test_builtins.bat.exp | 1 + programs/cmd/tests/test_builtins.cmd | 5 +++++ programs/cmd/tests/test_builtins.cmd.exp | 1 + 4 files changed, 12 insertions(+) diff --git a/programs/cmd/tests/test_builtins.bat b/programs/cmd/tests/test_builtins.bat index 1bd3de55292..5f297430905 100644 --- a/programs/cmd/tests/test_builtins.bat +++ b/programs/cmd/tests/test_builtins.bat @@ -92,6 +92,11 @@ rem call :setError 666 & (start /B I\dont\exist.exe &&echo SUCCESS !errorlevel!| rem can't run this test, generates a nice popup under windows call :setError 666 & (start "" /B /WAIT cmd.exe /c "echo foo & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (start "" /B cmd.exe /c "(choice /C:YN /T:3 /D:Y > NUL) & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +mkdir foo & cd foo +set "FOO_PATH=%cd%" > NUL +cd .. +call :setError 666 & (start /B /WAIT /d "%FOO_PATH%" cmd /s /c "if /I \"%%cd%%\"==\"%FOO_PATH%\" (exit 0) else (exit 1)" >nul &&echo !errorlevel!) +rd /q /s foo echo --- success/failure for TYPE command mkdir foo & cd foo echo a > fileA diff --git a/programs/cmd/tests/test_builtins.bat.exp b/programs/cmd/tests/test_builtins.bat.exp index 397b720c3bf..85ac8052802 100644 --- a/programs/cmd/tests/test_builtins.bat.exp +++ b/programs/cmd/tests/test_builtins.bat.exp @@ -62,6 +62,7 @@ FAILURE 255 foo@space@ SUCCESS 1024 @todo_wine@SUCCESS 666 +@todo_wine@0 --- success/failure for TYPE command FAILURE 1 SUCCESS 0 diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index aa709f31850..9564168adf8 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -675,6 +675,11 @@ rem call :setError 666 & (start /B I\dont\exist.exe &&echo SUCCESS !errorlevel!| rem can't run this test, generates a nice popup under windows call :setError 666 & (start "" /B /WAIT cmd.exe /c "echo foo & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (start "" /B cmd.exe /c "(choice /C:YN /T:3 /D:Y > NUL) & exit /b 1024" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +mkdir foo & cd foo +set "FOO_PATH=%cd%" > NUL +cd .. +call :setError 666 & (start /B /WAIT /d "%FOO_PATH%" cmd /s /c "if /I \"%%cd%%\"==\"%FOO_PATH%\" (exit 0) else (exit 1)" >nul &&echo !errorlevel!) +rd /q /s foo echo --- success/failure for TYPE command mkdir foo & cd foo echo a > fileA diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index dbbfbba27fb..53143ea9b7f 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -581,6 +581,7 @@ FAILURE 255 foo@space@ SUCCESS 1024 @todo_wine@SUCCESS 666 +@todo_wine@0 --- success/failure for TYPE command FAILURE 1 SUCCESS 0 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9946
From: YeshunYe <yeyeshun@uniontech.com> Signed-off-by: YeshunYe <yeyeshun@uniontech.com> --- programs/cmd/tests/test_builtins.bat.exp | 2 +- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/start/start.c | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/programs/cmd/tests/test_builtins.bat.exp b/programs/cmd/tests/test_builtins.bat.exp index 85ac8052802..1a7492ccc2b 100644 --- a/programs/cmd/tests/test_builtins.bat.exp +++ b/programs/cmd/tests/test_builtins.bat.exp @@ -62,7 +62,7 @@ FAILURE 255 foo@space@ SUCCESS 1024 @todo_wine@SUCCESS 666 -@todo_wine@0 +0 --- success/failure for TYPE command FAILURE 1 SUCCESS 0 diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 53143ea9b7f..7899d48d507 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -581,7 +581,7 @@ FAILURE 255 foo@space@ SUCCESS 1024 @todo_wine@SUCCESS 666 -@todo_wine@0 +0 --- success/failure for TYPE command FAILURE 1 SUCCESS 0 diff --git a/programs/start/start.c b/programs/start/start.c index 80f623e4c66..8f9500662e7 100644 --- a/programs/start/start.c +++ b/programs/start/start.c @@ -458,6 +458,18 @@ static void parse_command_line( int argc, WCHAR *argv[] ) usage(); } else opts.sei.lpDirectory = argv[++i]; + + if (opts.sei.lpDirectory[0] == '\"') + { + int len = wcslen(opts.sei.lpDirectory); + /* no need to free since the process will exit shortly */ + if (len > 1 && opts.sei.lpDirectory[len - 1] == '\"') + { + WCHAR* lpDirectory = wcsdup(opts.sei.lpDirectory); + lpDirectory[len - 1] = 0; + opts.sei.lpDirectory = lpDirectory + 1; + } + } } else if (is_option(argv[i], L"/b")) opts.creation_flags &= ~CREATE_NEW_CONSOLE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9946
On Tue Jan 27 08:53:26 2026 +0000, Yeshun Ye wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/9946/diffs?diff_id=240419&start_sha=6db6536b5233e1bd79a7b36927cfbbbf6e85be00#7db3e808af605ddc6fad0536ce0eecd8c4a8ed46_467_466) I have added validation for the `len` variable.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/9946#note_128121
On Tue Jan 27 08:53:27 2026 +0000, Yeshun Ye wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/9946/diffs?diff_id=240419&start_sha=6db6536b5233e1bd79a7b36927cfbbbf6e85be00#7db3e808af605ddc6fad0536ce0eecd8c4a8ed46_470_470) Under qualifying conditions, the quotation marks will be removed; in other cases, the original logic will be preserved.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/9946#note_128122
This merge request was approved by eric pouech. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9946
participants (3)
-
eric pouech (@epo) -
Yeshun Ye (@yeyeshun) -
YeshunYe