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