Remove disabled shell32-Quoted_ShellExecute patchset (bug already fixed and all tests pass).

This commit is contained in:
Sebastian Lackner 2015-11-01 01:07:39 +01:00
parent dc86f5c543
commit 15733c4eb8
4 changed files with 6 additions and 176 deletions

5
debian/changelog vendored
View File

@ -1,3 +1,8 @@
wine-staging (1.7.55) UNRELEASED; urgency=low
* Remove disabled shell32-Quoted_ShellExecute patchset (bug already fixed and
all tests pass).
-- Sebastian Lackner <sebastian@fds-team.de> Sun, 01 Nov 2015 01:06:20 +0100
wine-staging (1.7.54) unstable; urgency=low
* Updated server-FileEndOfFileInformation patchset, growing a memory mapped
file should still work.

View File

@ -58,7 +58,7 @@ upstream_commit()
# Show version information
version()
{
echo "Wine Staging 1.7.54"
echo "Wine Staging 1.7.55 (unreleased)"
echo "Copyright (C) 2014-2015 the Wine Staging project authors."
echo ""
echo "Patchset to be applied on upstream Wine:"

View File

@ -1,173 +0,0 @@
From bed6c718ccc09100c20527dde2801c94f7776108 Mon Sep 17 00:00:00 2001
From: Stefan Leichter <Stefan.Leichter@camline.com>
Date: Mon, 5 Jan 2015 00:18:14 -0700
Subject: shell32: Quote program name in ShellExecuteEx if it contains spaces.
---
dlls/shell32/shlexec.c | 33 +++++++++++++++++++++++----------
dlls/shell32/tests/shlexec.c | 32 ++++++++++++++++++++++++++++++--
2 files changed, 53 insertions(+), 12 deletions(-)
diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c
index 2d9690a..df0f11c 100644
--- a/dlls/shell32/shlexec.c
+++ b/dlls/shell32/shlexec.c
@@ -1558,6 +1558,7 @@ static void do_error_dialog( UINT_PTR retval, HWND hwnd )
*/
static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
{
+ static const WCHAR wQuote[] = {'\"',0};
static const WCHAR wSpace[] = {' ',0};
static const WCHAR wWww[] = {'w','w','w',0};
static const WCHAR wHttp[] = {'h','t','t','p',':','/','/',0};
@@ -1580,6 +1581,7 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
LPCWSTR lpFile;
UINT_PTR retval = SE_ERR_NOASSOC;
BOOL appKnownSingular = FALSE;
+ BOOL needs_quote;
/* make a local copy of the LPSHELLEXECUTEINFO structure and work with this from now on */
sei_tmp = *sei;
@@ -1802,32 +1804,35 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
}
else
{
- /* If the executable name is not quoted, we have to use this search loop here,
- that in CreateProcess() is not sufficient because it does not handle shell links. */
+ /* FIXME: what versions support this? Fails on 2000/XP
+ * If the executable name is not quoted, we have to use this search loop here,
+ * that in CreateProcess() is not sufficient because it does not handle shell links. */
WCHAR buffer[MAX_PATH], xlpFile[MAX_PATH];
- LPWSTR space, s;
+ LPWSTR space;
- LPWSTR beg = wszApplicationName/*sei_tmp.lpFile*/;
- for(s=beg; (space=strchrW(s, ' ')); s=space+1) {
- int idx = space-sei_tmp.lpFile;
- memcpy(buffer, sei_tmp.lpFile, idx * sizeof(WCHAR));
+ lstrcpynW(buffer, wszApplicationName, sizeof(buffer)/sizeof(WCHAR));
+ space = buffer + strlenW(buffer);
+ do
+ {
+ int idx = space-buffer;
buffer[idx] = '\0';
/*FIXME This finds directory paths if the targeted file name contains spaces. */
if (SearchPathW(*sei_tmp.lpDirectory? sei_tmp.lpDirectory: NULL, buffer, wszExe, sizeof(xlpFile)/sizeof(xlpFile[0]), xlpFile, NULL))
{
/* separate out command from parameter string */
- LPCWSTR p = space + 1;
+ LPCWSTR p = wszApplicationName + idx;
while(isspaceW(*p))
++p;
strcpyW(wszParameters, p);
- *space = '\0';
+ wszApplicationName[idx] = '\0';
break;
}
}
+ while((space=strrchrW(buffer, ' ')));
lpFile = sei_tmp.lpFile;
}
@@ -1836,6 +1841,9 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
wcmd = wcmdBuffer;
len = lstrlenW(wszApplicationName) + 1;
+ needs_quote = NULL != strstrW(wszApplicationName,wSpace);
+ if (needs_quote)
+ len += 2;
if (sei_tmp.lpParameters[0])
len += 1 + lstrlenW(wszParameters);
if (len > wcmdLen)
@@ -1843,7 +1851,12 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
wcmd = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
wcmdLen = len;
}
- strcpyW(wcmd, wszApplicationName);
+
+ wcmd[0] = 0;
+ if (needs_quote) strcatW(wcmd, wQuote);
+ strcatW(wcmd, wszApplicationName);
+ if (needs_quote) strcatW(wcmd, wQuote);
+
if (sei_tmp.lpParameters[0]) {
strcatW(wcmd, wSpace);
strcatW(wcmd, wszParameters);
diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index f81794e..2b3947e 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -857,6 +857,7 @@ static const char* testfiles[]=
"%s\\masked",
"%s\\test file.sde",
"%s\\test file.exe",
+ "%s\\test file two.exe",
"%s\\test2.exe",
"%s\\simple.shlexec",
"%s\\drawback_file.noassoc",
@@ -931,7 +932,7 @@ static void test_lpFile_parsed(void)
/* existing "drawback_file.noassoc" prevents finding "drawback_file.noassoc foo.shlexec" on wine */
sprintf(fileA, "%s\\drawback_file.noassoc foo.shlexec", tmpdir);
rc=shell_execute(NULL, fileA, NULL, NULL);
- todo_wine ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
+ ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
/* if quoted, existing "drawback_file.noassoc" not prevents finding "drawback_file.noassoc foo.shlexec" on wine */
sprintf(fileA, "\"%s\\drawback_file.noassoc foo.shlexec\"", tmpdir);
@@ -1547,7 +1548,7 @@ static void test_filename(void)
"%s failed: rc=%ld err=%u\n", shell_call,
rc, GetLastError());
}
- else todo_wine
+ else
{
ok(rc==test->rc, "%s failed: rc=%ld err=%u\n", shell_call,
rc, GetLastError());
@@ -2094,6 +2095,7 @@ static void test_exes(void)
{
char filename[MAX_PATH];
char params[1024];
+ DWORD retval;
INT_PTR rc;
sprintf(params, "shlexec \"%s\" Exec", child_file);
@@ -2120,6 +2122,32 @@ static void test_exes(void)
{
win_skip("Skipping shellexecute of file with unassociated extension\n");
}
+
+ /* the directory with the test programs contain "test file.exe"
+ * and "test file two.exe". Check we do not start the first
+ * when we specify to start the second (see bug 19666)
+ */
+ sprintf(filename, "%s\\test file.exe", tmpdir);
+ retval = CopyFileA(argv0, filename, FALSE);
+ ok(retval, "CopyFile(\"%s\",\"%s\",FALSE) failed\n", argv0, filename);
+ sprintf(filename, "%s\\test file two.exe", tmpdir);
+ retval = CopyFileA(argv0, filename, FALSE);
+ ok(retval, "CopyFile(\"%s\",\"%s\",FALSE) failed\n", argv0, filename);
+ rc=shell_execute_ex(SEE_MASK_NOZONECHECKS, NULL, filename, params, NULL, NULL);
+ ok(rc > 32, "%s returned %lu\n", shell_call, rc);
+ okChildInt("argcA", 4);
+ okChildString("argvA0", filename);
+ okChildString("argvA3", "Exec");
+
+ /* check quoted filename */
+ sprintf(filename, "\"%s\\test file two.exe\"", tmpdir);
+ rc=shell_execute_ex(SEE_MASK_NOZONECHECKS, NULL, filename, params, NULL, NULL);
+ ok(rc > 32, "%s returned %lu\n", shell_call, rc);
+ okChildInt("argcA", 4);
+ /* strip the quotes for the compare */
+ sprintf(filename, "%s\\test file two.exe", tmpdir);
+ okChildString("argvA0", filename);
+ okChildString("argvA3", "Exec");
}
typedef struct
--
1.9.1

View File

@ -1,2 +0,0 @@
# Fixes: [19666] Multiple applications start wrong executable if whitespace present in name
Disabled: true