Piotr Caban : shell32: Fix SHELL_execute code that removes quote arround file name.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 16 08:37:19 CDT 2015


Module: wine
Branch: master
Commit: 943ead502295793f608ad65eb0ca144ba67546ce
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=943ead502295793f608ad65eb0ca144ba67546ce

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Jul 15 17:34:09 2015 +0200

shell32: Fix SHELL_execute code that removes quote arround file name.

---

 dlls/shell32/shlexec.c       | 11 +++++------
 dlls/shell32/tests/shlexec.c | 11 +++++++++++
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c
index 2505981..3196149 100644
--- a/dlls/shell32/shlexec.c
+++ b/dlls/shell32/shlexec.c
@@ -1592,14 +1592,13 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
         wszApplicationName = HeapAlloc(GetProcessHeap(), 0, dwApplicationNameLen*sizeof(WCHAR));
         *wszApplicationName = '\0';
     }
-    else if (*sei_tmp.lpFile == '\"')
+    else if (*sei_tmp.lpFile == '\"' && sei_tmp.lpFile[(len = strlenW(sei_tmp.lpFile))-1] == '\"')
     {
-        DWORD l = strlenW(sei_tmp.lpFile+1);
-        if(l >= dwApplicationNameLen) dwApplicationNameLen = l+1;
+        if(len-1 >= dwApplicationNameLen) dwApplicationNameLen = len;
         wszApplicationName = HeapAlloc(GetProcessHeap(), 0, dwApplicationNameLen*sizeof(WCHAR));
-        memcpy(wszApplicationName, sei_tmp.lpFile+1, (l+1)*sizeof(WCHAR));
-        if (wszApplicationName[l-1] == '\"')
-            wszApplicationName[l-1] = '\0';
+        memcpy(wszApplicationName, sei_tmp.lpFile+1, len*sizeof(WCHAR));
+        if(len > 2)
+            wszApplicationName[len-2] = '\0';
         TRACE("wszApplicationName=%s\n",debugstr_w(wszApplicationName));
     } else {
         DWORD l = strlenW(sei_tmp.lpFile)+1;
diff --git a/dlls/shell32/tests/shlexec.c b/dlls/shell32/tests/shlexec.c
index e3b245a..3d95b41 100644
--- a/dlls/shell32/tests/shlexec.c
+++ b/dlls/shell32/tests/shlexec.c
@@ -905,6 +905,8 @@ static filename_tests_t filename_tests[]=
     {NULL,           "%s\\masked file.shlexec",   0x0, 33},
     /* Test if quoting prevents the masking */
     {NULL,           "%s\\masked file.shlexec",   0x40, 33},
+    /* Test with incorrect quote */
+    {NULL,           "\"%s\\masked file.shlexec",   0x0, SE_ERR_FNF},
 
     {NULL, NULL, 0}
 };
@@ -2114,6 +2116,15 @@ static void test_exes(void)
     {
         win_skip("Skipping shellexecute of file with unassociated extension\n");
     }
+
+    /* test combining executable and parameters */
+    sprintf(filename, "%s shlexec \"%s\" Exec", argv0, child_file);
+    rc = shell_execute(NULL, filename, NULL, NULL);
+    ok(rc == SE_ERR_FNF, "%s returned %lu\n", shell_call, rc);
+
+    sprintf(filename, "\"%s\" shlexec \"%s\" Exec", argv0, child_file);
+    rc = shell_execute(NULL, filename, NULL, NULL);
+    ok(rc == SE_ERR_FNF, "%s returned %lu\n", shell_call, rc);
 }
 
 typedef struct




More information about the wine-cvs mailing list