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