mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
Remove disabled shell32-Quoted_ShellExecute patchset (bug already fixed and all tests pass).
This commit is contained in:
parent
dc86f5c543
commit
15733c4eb8
5
debian/changelog
vendored
5
debian/changelog
vendored
@ -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.
|
||||
|
@ -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:"
|
||||
|
@ -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
|
||||
|
@ -1,2 +0,0 @@
|
||||
# Fixes: [19666] Multiple applications start wrong executable if whitespace present in name
|
||||
Disabled: true
|
Loading…
Reference in New Issue
Block a user