Hans Leidekker : fusion: Support buffer size queries in IAssemblyName:: GetName.

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


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

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

fusion: Support buffer size queries in IAssemblyName::GetName.

---

 dlls/fusion/asmname.c       | 19 ++++++++++++-------
 dlls/fusion/tests/asmname.c | 35 +++++++++++++++++++++++++++++++----
 2 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/dlls/fusion/asmname.c b/dlls/fusion/asmname.c
index f892f2b..c417a23 100644
--- a/dlls/fusion/asmname.c
+++ b/dlls/fusion/asmname.c
@@ -369,19 +369,24 @@ static HRESULT WINAPI IAssemblyNameImpl_GetName(IAssemblyName *iface,
                                                 WCHAR *pwzName)
 {
     IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
+    DWORD len;
 
     TRACE("(%p, %p, %p)\n", iface, lpcwBuffer, pwzName);
 
-    if (!name->name)
+    if (name->name)
+        len = strlenW(name->name) + 1;
+    else
+        len = 0;
+
+    if (*lpcwBuffer < len)
     {
-        *pwzName = '\0';
-        *lpcwBuffer = 0;
-        return S_OK;
+        *lpcwBuffer = len;
+        return E_NOT_SUFFICIENT_BUFFER;
     }
+    if (!name->name) lpcwBuffer[0] = 0;
+    else strcpyW(pwzName, name->name);
 
-    lstrcpyW(pwzName, name->name);
-    *lpcwBuffer = lstrlenW(pwzName) + 1;
-
+    *lpcwBuffer = len;
     return S_OK;
 }
 
diff --git a/dlls/fusion/tests/asmname.c b/dlls/fusion/tests/asmname.c
index a075288..68309f2 100644
--- a/dlls/fusion/tests/asmname.c
+++ b/dlls/fusion/tests/asmname.c
@@ -421,12 +421,12 @@ static void test_CreateAssemblyNameObject(void)
        broken(hr == E_INVALIDARG), /* .NET 1.x */
        "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
 
+    str[0] = 'a';
     size = MAX_PATH;
-    str[0] = '\0';
     hr = IAssemblyName_GetName(name, &size, str);
-    ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
-    ok(!str[0], "Expected empty name\n");
-    ok(size == 0, "Expected 0, got %d\n", size);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(str[0] == 'a', "got %c\n", str[0]);
+    ok(!size, "got %u\n", size);
 
     hi = 0xbeefcace;
     lo = 0xcafebabe;
@@ -457,6 +457,26 @@ static void test_CreateAssemblyNameObject(void)
        broken(hr == S_OK), /* .NET 1.x */
        "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
 
+    size = 0;
+    hr = IAssemblyName_GetName(name, &size, NULL);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
+    ok(size == 1, "got %u\n", size);
+
+    if (0) /* crash */
+    {
+    str[0] = '\0';
+    hr = IAssemblyName_GetName(name, NULL, str);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
+    ok(!str[0], "got %c\n", str[0]);
+    }
+
+    size = 0;
+    str[0] = '\0';
+    hr = IAssemblyName_GetName(name, &size, str);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
+    ok(!str[0], "got %c\n", str[0]);
+    ok(size == 1, "got %u\n", size);
+
     size = MAX_PATH;
     str[0] = '\0';
     hr = IAssemblyName_GetName(name, &size, str);
@@ -494,6 +514,13 @@ static void test_CreateAssemblyNameObject(void)
     ok_aw("wine", str);
     ok(size == 5, "Expected 5, got %d\n", size);
 
+    size = 0;
+    str[0] = 0;
+    hr = IAssemblyName_GetName(name, &size, str);
+    ok(hr == E_NOT_SUFFICIENT_BUFFER, "got %08x\n", hr);
+    ok(!str[0], "got %c\n", str[0]);
+    ok(size == 5, "got %u\n", size);
+
     size = MAX_PATH;
     str[0] = '\0';
     hr = IAssemblyName_GetName(name, &size, str);




More information about the wine-cvs mailing list