mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 17:07:16 +00:00
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:
parent
a484bf495e
commit
fac2e9a282
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue