Dmitry Timoshkov : gdiplus: Add a check for passed buffer size to GdipGetRegionData.
Alexandre Julliard
julliard at winehq.org
Wed Nov 13 13:34:40 CST 2013
Module: wine
Branch: master
Commit: 761391f156e67404d3c4db801f28da51d06d3654
URL: http://source.winehq.org/git/wine.git/?a=commit;h=761391f156e67404d3c4db801f28da51d06d3654
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Wed Nov 13 14:00:26 2013 +0900
gdiplus: Add a check for passed buffer size to GdipGetRegionData.
---
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));
More information about the wine-cvs
mailing list