[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(&region->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