fusion: Respect buffer size in IAssemblyNameImpl_GetProperty.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2017-11-09 16:07:48 +01:00 committed by Alexandre Julliard
parent a484bf495e
commit fac2e9a282
2 changed files with 47 additions and 10 deletions

View file

@ -31,6 +31,7 @@
#include "guiddef.h"
#include "fusion.h"
#include "corerror.h"
#include "strsafe.h"
#include "wine/debug.h"
#include "wine/unicode.h"
@ -138,11 +139,11 @@ static HRESULT WINAPI IAssemblyNameImpl_GetProperty(IAssemblyName *iface,
LPDWORD pcbProperty)
{
IAssemblyNameImpl *name = impl_from_IAssemblyName(iface);
DWORD size;
TRACE("(%p, %d, %p, %p)\n", iface, PropertyId, pvProperty, pcbProperty);
*((LPWSTR)pvProperty) = '\0';
size = *pcbProperty;
switch (PropertyId)
{
case ASM_NAME_NULL_PUBLIC_KEY:
@ -158,45 +159,65 @@ static HRESULT WINAPI IAssemblyNameImpl_GetProperty(IAssemblyName *iface,
*pcbProperty = 0;
if (name->name)
{
lstrcpyW(pvProperty, name->name);
*pcbProperty = (lstrlenW(name->name) + 1) * 2;
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
lstrcpyW(pvProperty, name->name);
}
break;
case ASM_NAME_MAJOR_VERSION:
*pcbProperty = 0;
*((WORD *)pvProperty) = name->version[0];
if (name->versize >= 1)
{
*pcbProperty = sizeof(WORD);
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
*((WORD *)pvProperty) = name->version[0];
}
break;
case ASM_NAME_MINOR_VERSION:
*pcbProperty = 0;
*((WORD *)pvProperty) = name->version[1];
if (name->versize >= 2)
{
*pcbProperty = sizeof(WORD);
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
*((WORD *)pvProperty) = name->version[1];
}
break;
case ASM_NAME_BUILD_NUMBER:
*pcbProperty = 0;
*((WORD *)pvProperty) = name->version[2];
if (name->versize >= 3)
{
*pcbProperty = sizeof(WORD);
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
*((WORD *)pvProperty) = name->version[2];
}
break;
case ASM_NAME_REVISION_NUMBER:
*pcbProperty = 0;
*((WORD *)pvProperty) = name->version[3];
if (name->versize >= 4)
{
*pcbProperty = sizeof(WORD);
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
*((WORD *)pvProperty) = name->version[3];
}
break;
case ASM_NAME_CULTURE:
*pcbProperty = 0;
if (name->culture)
{
lstrcpyW(pvProperty, name->culture);
*pcbProperty = (lstrlenW(name->culture) + 1) * 2;
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
lstrcpyW(pvProperty, name->culture);
}
break;
@ -204,8 +225,10 @@ static HRESULT WINAPI IAssemblyNameImpl_GetProperty(IAssemblyName *iface,
*pcbProperty = 0;
if (name->haspubkey)
{
memcpy(pvProperty, name->pubkey, sizeof(DWORD) * 2);
*pcbProperty = sizeof(DWORD) * 2;
if (size < *pcbProperty)
return STRSAFE_E_INSUFFICIENT_BUFFER;
memcpy(pvProperty, name->pubkey, sizeof(DWORD) * 2);
}
break;

View file

@ -24,6 +24,7 @@
#include <mscoree.h>
#include <fusion.h>
#include <corerror.h>
#include <strsafe.h>
#include "wine/test.h"
@ -362,7 +363,11 @@ static void test_assembly_name_props_line(IAssemblyName *name,
if (hr != E_INVALIDARG)
{
ok(size == vals[i].size, "%d: prop %d: Expected %d, got %d\n", line, i, vals[i].size, size);
if (size && size != MAX_PATH)
if (!size)
{
ok(str[0] == 0xcccc, "%d: prop %d: str[0] = %x\n", line, i, str[0]);
}
else if (size != MAX_PATH)
{
if (i != ASM_NAME_NAME && i != ASM_NAME_CULTURE)
ok( !memcmp( vals[i].val, str, size ), "%d: prop %d: wrong value\n", line, i );
@ -370,6 +375,15 @@ static void test_assembly_name_props_line(IAssemblyName *name,
ok( !lstrcmpW( expect, str ), "%d: prop %d: Expected %s, got %s\n",
line, i, wine_dbgstr_w(expect), wine_dbgstr_w(str) );
}
if (size != 0 && size != MAX_PATH)
{
size--;
hr = IAssemblyName_GetProperty(name, i, str, &size);
ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER,
"%d: prop %d: Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", line, i, hr);
ok(size == vals[i].size, "%d: prop %d: Expected %d, got %d\n", line, i, vals[i].size, size);
}
}
}
}