Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56940
Attempt to fix the regression caused by 0bad544aab9e2c9ee93bbabac0386e02c58a39c0. Unfortunately the author of that patch doesn't seem to be active anymore, so here's an attempt, with the remark that I don't know why it worked before that patch, and I'm not sure sure if this is the correct way to fix this.
The only thing I know for sure is that on windows one can start an app via ShellExecuteW with a trailing space, and in wine this doesn't work anymore, and it did work before that commit.
From: Louis Lenders xerox.xerox2000x@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56940
Attempt to fix the regression caused by 0bad544aab9e2c9ee93bbabac0386e02c58a39c0. Unfortunately the author of that patch doesn't seem to be active anymore, so here's an attempt, with the remark that I don't know why it worked before that patch, and I'm not sure sure if this is the correct way to fix this.
The only thing I know for sure is that on windows one can start an app via ShellExecuteW with a trailing space, and in wine this doesn't work anymore, and it did work before that commit. --- dlls/shell32/shlexec.c | 8 ++++++++ dlls/shell32/tests/shlexec.c | 9 +++++++++ 2 files changed, 17 insertions(+)
diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c index 828c7168a34..501ed0fcab9 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -1655,6 +1655,14 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
sei->hProcess = NULL;
+ /* remove trailing spaces */ + if (sei_tmp.lpFile) + { + WCHAR *buf = wcsdup(sei->lpFile), *end = buf + wcslen( buf ) - 1; + while (end >= buf && *end == ' ') *end-- = 0; + sei_tmp.lpFile = buf; + } + /* make copies of all path/command strings */ if (!sei_tmp.lpFile) { diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c index bd32ece8705..9579e18a531 100644 --- a/dlls/shell32/tests/shlexec.c +++ b/dlls/shell32/tests/shlexec.c @@ -1166,6 +1166,15 @@ static void test_lpFile_parsed(void) NULL, ""%TMPDIR%\simple.shlexec"", NULL, NULL, NULL); okShell(rc > 32 || broken(rc == SE_ERR_FNF) /* Win95/NT4 */, "failed: rc=%Iu\n", rc); + /* test lpfile + trailing space */ + rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, + NULL, "%TMPDIR%\simple.shlexec ", NULL, NULL, NULL); + okShell(rc > 32, "failed: rc=%Iu\n", rc); + /* test lpfile + leading space */ + rc=shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI, + NULL, " %TMPDIR%\simple.shlexec", NULL, NULL, NULL); + okShell(rc == SE_ERR_FNF, "failed: rc=%Iu\n", rc); + }
typedef struct
Hans Leidekker (@hans) commented about dlls/shell32/shlexec.c:
sei->hProcess = NULL;
- /* remove trailing spaces */
- if (sei_tmp.lpFile)
- {
WCHAR *buf = wcsdup(sei->lpFile), *end = buf + wcslen( buf ) - 1;
while (end >= buf && *end == ' ') *end-- = 0;
sei_tmp.lpFile = buf;
- }
Thanks Louis. Could you also test and handle leading spaces if needed? Also, buf is not freed. I think it would be better to integrate this in the code below that already creates a copy. It should be possible to have just one block where you skip leading/trailing spaces as well as outer quotes, if any.