[3/4] gdiplus: Add a check for passed buffer size to GdipGetRegionData.
Dmitry Timoshkov
dmitry at baikal.ru
Tue Nov 12 23:00:26 CST 2013
---
dlls/gdiplus/region.c | 12 +++++++++++-
dlls/gdiplus/tests/region.c | 3 ---
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c
index aef2ac7..0295e62 100644
--- a/dlls/gdiplus/region.c
+++ b/dlls/gdiplus/region.c
@@ -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(®ion->node);
region_header->checksum = 0;
diff --git a/dlls/gdiplus/tests/region.c b/dlls/gdiplus/tests/region.c
index dcf5092..77fb4fe 100644
--- a/dlls/gdiplus/tests/region.c
+++ b/dlls/gdiplus/tests/region.c
@@ -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));
--
1.8.4.2
More information about the wine-patches
mailing list