Alexandre Julliard : shell32: Fix setting of NULL arguments in IShellLink.

Alexandre Julliard julliard at winehq.org
Tue Nov 17 09:28:15 CST 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Nov 16 20:09:48 2009 +0100

shell32: Fix setting of NULL arguments in IShellLink.

---

 dlls/shell32/shelllink.c       |   25 +++++++++++++++++--------
 dlls/shell32/tests/shelllink.c |   14 ++++++++++++++
 2 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c
index 414cc54..3b16170 100644
--- a/dlls/shell32/shelllink.c
+++ b/dlls/shell32/shelllink.c
@@ -1497,9 +1497,13 @@ static HRESULT WINAPI IShellLinkA_fnSetArguments(IShellLinkA * iface, LPCSTR psz
     TRACE("(%p)->(args=%s)\n",This, pszArgs);
 
     HeapFree(GetProcessHeap(), 0, This->sArgs);
-    This->sArgs = HEAP_strdupAtoW( GetProcessHeap(), 0, pszArgs);
-    if( !This->sArgs )
-        return E_OUTOFMEMORY;
+    if (pszArgs)
+    {
+        This->sArgs = HEAP_strdupAtoW( GetProcessHeap(), 0, pszArgs);
+        if( !This->sArgs )
+            return E_OUTOFMEMORY;
+    }
+    else This->sArgs = NULL;
 
     This->bDirty = TRUE;
 
@@ -1877,11 +1881,16 @@ static HRESULT WINAPI IShellLinkW_fnSetArguments(IShellLinkW * iface, LPCWSTR ps
     TRACE("(%p)->(args=%s)\n",This, debugstr_w(pszArgs));
 
     HeapFree(GetProcessHeap(), 0, This->sArgs);
-    This->sArgs = HeapAlloc( GetProcessHeap(), 0,
-                             (lstrlenW( pszArgs )+1)*sizeof (WCHAR) );
-    if ( !This->sArgs )
-        return E_OUTOFMEMORY;
-    lstrcpyW( This->sArgs, pszArgs );
+    if (pszArgs)
+    {
+        This->sArgs = HeapAlloc( GetProcessHeap(), 0,
+                                 (lstrlenW( pszArgs )+1)*sizeof (WCHAR) );
+        if ( !This->sArgs )
+            return E_OUTOFMEMORY;
+        lstrcpyW( This->sArgs, pszArgs );
+    }
+    else This->sArgs = NULL;
+
     This->bDirty = TRUE;
 
     return S_OK;
diff --git a/dlls/shell32/tests/shelllink.c b/dlls/shell32/tests/shelllink.c
index 2f20200..2535471 100644
--- a/dlls/shell32/tests/shelllink.c
+++ b/dlls/shell32/tests/shelllink.c
@@ -275,6 +275,20 @@ static void test_get_set(void)
     ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r);
     ok(lstrcmp(buffer,str)==0, "GetArguments returned '%s'\n", buffer);
 
+    strcpy(buffer,"garbage");
+    r = IShellLinkA_SetArguments(sl, NULL);
+    ok(SUCCEEDED(r), "SetArguments failed (0x%08x)\n", r);
+    r = IShellLinkA_GetArguments(sl, buffer, sizeof(buffer));
+    ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r);
+    ok(!buffer[0] || lstrcmp(buffer,str)==0, "GetArguments returned '%s'\n", buffer);
+
+    strcpy(buffer,"garbage");
+    r = IShellLinkA_SetArguments(sl, "");
+    ok(SUCCEEDED(r), "SetArguments failed (0x%08x)\n", r);
+    r = IShellLinkA_GetArguments(sl, buffer, sizeof(buffer));
+    ok(SUCCEEDED(r), "GetArguments failed (0x%08x)\n", r);
+    ok(!buffer[0], "GetArguments returned '%s'\n", buffer);
+
     /* Test Getting / Setting showcmd */
     i=0xdeadbeef;
     r = IShellLinkA_GetShowCmd(sl, &i);




More information about the wine-cvs mailing list