Hans Leidekker : fusion: Fix insufficient buffer size handling in IAssemblyName::GetDisplayName.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Apr 10 08:56:27 CDT 2015


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Apr 10 12:57:15 2015 +0200

fusion: Fix insufficient buffer size handling in IAssemblyName::GetDisplayName.

---

 dlls/fusion/asmname.c       | 16 ++++++++++------
 dlls/fusion/tests/asmname.c | 17 +++++++++++++++++
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/dlls/fusion/asmname.c b/dlls/fusion/asmname.c
index c417a23..f7a9452 100644
--- a/dlls/fusion/asmname.c
+++ b/dlls/fusion/asmname.c
@@ -228,12 +228,10 @@ static HRESULT WINAPI IAssemblyNameImpl_GetDisplayName(IAssemblyName *iface,
                                                        LPDWORD pccDisplayName,
                                                        DWORD dwDisplayFlags)
 {
+    static const WCHAR equals[] = {'=',0};
     IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
-    WCHAR verstr[30];
+    WCHAR verstr[30], *cultureval = NULL;
     DWORD size;
-    LPWSTR cultureval = 0;
-
-    static const WCHAR equals[] = {'=',0};
 
     TRACE("(%p, %p, %p, %d)\n", iface, szDisplayName,
           pccDisplayName, dwDisplayFlags);
@@ -243,9 +241,15 @@ static HRESULT WINAPI IAssemblyNameImpl_GetDisplayName(IAssemblyName *iface,
         if (!name->displayname || !*name->displayname)
             return FUSION_E_INVALID_NAME;
 
-        size = min(*pccDisplayName, lstrlenW(name->displayname) + 1);
+        size = strlenW(name->displayname) + 1;
+
+        if (*pccDisplayName < size)
+        {
+            *pccDisplayName = size;
+            return E_NOT_SUFFICIENT_BUFFER;
+        }
 
-        lstrcpynW(szDisplayName, name->displayname, size);
+        if (szDisplayName) strcpyW(szDisplayName, name->displayname);
         *pccDisplayName = size;
 
         return S_OK;
diff --git a/dlls/fusion/tests/asmname.c b/dlls/fusion/tests/asmname.c
index 68309f2..e415c3a9 100644
--- a/dlls/fusion/tests/asmname.c
+++ b/dlls/fusion/tests/asmname.c
@@ -508,6 +508,23 @@ static void test_CreateAssemblyNameObject(void)
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
     ok(name != NULL, "Expected non-NULL name\n");
 
+    size = 0;
+    hr = IAssemblyName_GetDisplayName(name, NULL, &size, 0);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
+    ok(size == 5, "got %u\n", size);
+
+    size = 3;
+    hr = IAssemblyName_GetDisplayName(name, NULL, &size, 0);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER || broken(hr == E_INVALIDARG), "got %08x\n", hr);
+    ok(size == 5 || broken(size == 3), "got %u\n", size);
+
+    size = 3;
+    str[0] = 'a';
+    hr = IAssemblyName_GetDisplayName(name, str, &size, 0);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
+    ok(str[0] == 'a', "got %c\n", str[0]);
+    ok(size == 5, "got %u\n", size);
+
     size = MAX_PATH;
     hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
     ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);




More information about the wine-cvs mailing list