Juan Lang : shell32: Dynamically allocate memory for executing an URL.

Alexandre Julliard julliard at winehq.org
Mon Nov 19 08:19:37 CST 2007


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Nov 16 12:43:35 2007 -0800

shell32: Dynamically allocate memory for executing an URL.

---

 dlls/shell32/shlexec.c |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c
index 1b891b3..c95d599 100644
--- a/dlls/shell32/shlexec.c
+++ b/dlls/shell32/shlexec.c
@@ -1407,9 +1407,11 @@ static UINT_PTR SHELL_execute_url( LPCWSTR lpFile, LPCWSTR wFile, LPCWSTR wcmd,
 {
     static const WCHAR wShell[] = {'\\','s','h','e','l','l','\\',0};
     static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0};
-    WCHAR lpstrProtocol[256];
+    UINT_PTR retval;
+    WCHAR *lpstrProtocol;
     LPCWSTR lpstrRes;
     INT iSize;
+    DWORD len;
 
     lpstrRes = strchrW(lpFile, ':');
     if (lpstrRes)
@@ -1419,6 +1421,12 @@ static UINT_PTR SHELL_execute_url( LPCWSTR lpFile, LPCWSTR wFile, LPCWSTR wcmd,
 
     TRACE("Got URL: %s\n", debugstr_w(lpFile));
     /* Looking for ...protocol\shell\lpOperation\command */
+    len = iSize + lstrlenW(wShell) + lstrlenW(wCommand) + 1;
+    if (psei->lpVerb)
+        len += lstrlenW(psei->lpVerb);
+    else
+        len += lstrlenW(wszOpen);
+    lpstrProtocol = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
     memcpy(lpstrProtocol, lpFile, iSize*sizeof(WCHAR));
     lpstrProtocol[iSize] = '\0';
     strcatW(lpstrProtocol, wShell);
@@ -1432,8 +1440,10 @@ static UINT_PTR SHELL_execute_url( LPCWSTR lpFile, LPCWSTR wFile, LPCWSTR wcmd,
         lpFile += iSize;
         while (*lpFile == ':') lpFile++;
     }
-    return execute_from_key(lpstrProtocol, lpFile, NULL, psei->lpParameters,
-                            wcmd, execfunc, psei, psei_out);
+    retval = execute_from_key(lpstrProtocol, lpFile, NULL, psei->lpParameters,
+                              wcmd, execfunc, psei, psei_out);
+    HeapFree(GetProcessHeap(), 0, lpstrProtocol);
+    return retval;
 }
 
 /*************************************************************************




More information about the wine-cvs mailing list