Vincent Povirk : gdiplus: Don't try to free invalid or already-freed images .
Alexandre Julliard
julliard at winehq.org
Fri Oct 1 11:38:44 CDT 2010
Module: wine
Branch: master
Commit: 9326fc13ca25a4c10bc122ef15041f90b636e6d3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9326fc13ca25a4c10bc122ef15041f90b636e6d3
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu Sep 30 12:33:36 2010 -0500
gdiplus: Don't try to free invalid or already-freed images.
---
dlls/gdiplus/image.c | 10 ++++++++--
dlls/gdiplus/tests/image.c | 24 ++++++++++++++++++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 4ed226d..9b83d95 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1958,8 +1958,6 @@ GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
if(!image)
return InvalidParameter;
- if (image->picture)
- IPicture_Release(image->picture);
if (image->type == ImageTypeBitmap)
{
GdipFree(((GpBitmap*)image)->bitmapbits);
@@ -1967,7 +1965,15 @@ GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
DeleteDC(((GpBitmap*)image)->hdc);
DeleteObject(((GpBitmap*)image)->hbitmap);
}
+ else if (image->type != ImageTypeMetafile)
+ {
+ WARN("invalid image: %p\n", image);
+ return ObjectBusy;
+ }
+ if (image->picture)
+ IPicture_Release(image->picture);
GdipFree(image->palette_entries);
+ image->type = ~0;
GdipFree(image);
return Ok;
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index f00d003..b2b1a0f 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -2250,6 +2250,29 @@ static void test_colorkey(void)
GdipDisposeImageAttributes(imageattr);
}
+static void test_dispose(void)
+{
+ GpStatus stat;
+ GpImage *image;
+ char invalid_image[256];
+
+ stat = GdipDisposeImage(NULL);
+ expect(InvalidParameter, stat);
+
+ stat = GdipCreateBitmapFromScan0(2, 2, 0, PixelFormat32bppARGB, NULL, (GpBitmap**)&image);
+ expect(Ok, stat);
+
+ stat = GdipDisposeImage(image);
+ expect(Ok, stat);
+
+ stat = GdipDisposeImage(image);
+ expect(ObjectBusy, stat);
+
+ memset(invalid_image, 0, 256);
+ stat = GdipDisposeImage((GpImage*)invalid_image);
+ expect(ObjectBusy, stat);
+}
+
START_TEST(image)
{
struct GdiplusStartupInput gdiplusStartupInput;
@@ -2289,6 +2312,7 @@ START_TEST(image)
test_rotateflip();
test_remaptable();
test_colorkey();
+ test_dispose();
GdiplusShutdown(gdiplusToken);
}
More information about the wine-cvs
mailing list