[PATCH 0/1] MR6997: shell32: Remove trailing spaces from lpFile in SHELL_execute.
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. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/6997
From: Louis Lenders <xerox.xerox2000x(a)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 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6997
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. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/6997#note_90276
participants (3)
-
Hans Leidekker (@hans) -
Louis Lenders -
Louis Lenders (@xe)