gdiplus: Add a check for passed buffer size to GdipGetRegionData.

This commit is contained in:
Dmitry Timoshkov 2013-11-13 14:00:26 +09:00 committed by Alexandre Julliard
parent 8dc170e2ca
commit 761391f156
2 changed files with 11 additions and 4 deletions

View File

@ -828,12 +828,22 @@ GpStatus WINGDIPAPI GdipGetRegionData(GpRegion *region, BYTE *buffer, UINT size,
DWORD num_children;
} *region_header;
INT filled = 0;
UINT required;
GpStatus status;
TRACE("%p, %p, %d, %p\n", region, buffer, size, needed);
if (!(region && buffer && size))
if (!region || !buffer || !size)
return InvalidParameter;
status = GdipGetRegionDataSize(region, &required);
if (status != Ok) return status;
if (size < required)
{
if (needed) *needed = size;
return InsufficientBuffer;
}
region_header = (struct _region_header *)buffer;
region_header->size = sizeheader_size + get_element_size(&region->node);
region_header->checksum = 0;

View File

@ -133,11 +133,8 @@ static void test_getregiondata(void)
memset(buf, 0xee, sizeof(buf));
needed = 0;
status = GdipGetRegionData(region, (BYTE*)buf, 4, &needed);
todo_wine
ok(status == InsufficientBuffer, "status %08x\n", status);
todo_wine
expect(4, needed);
todo_wine
expect_dword(buf, 0xeeeeeeee);
memset(buf, 0xee, sizeof(buf));