[PATCH 2/4] (try 2) gdiplus: Fix memory leak in GdipLockBitmapBits.
Nathan Beckmann
nathan.beckmann at gmail.com
Fri Mar 7 03:19:03 CST 2008
Memory allocated in GdipLockBitmapBits wasn't kept track of for read
operations.
A bitmap that was disposed of before calling GdipUnlockBitmapBits
would leak this memory as well.
(try 2): Free the right field (bitmapbits, not Scan0) on read locks.
---
dlls/gdiplus/image.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 7009197..6b827ba 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -170,8 +170,7 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
bitmap->lockmode = flags;
bitmap->numlocks++;
- if(flags & ImageLockModeWrite)
- bitmap->bitmapbits = buff;
+ bitmap->bitmapbits = buff;
return Ok;
}
@@ -198,7 +197,8 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
if(!(--bitmap->numlocks))
bitmap->lockmode = 0;
- GdipFree(lockeddata->Scan0);
+ GdipFree(bitmap->bitmapbits);
+ bitmap->bitmapbits = NULL;
return Ok;
}
@@ -225,6 +225,7 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
}
GdipFree(bitmap->bitmapbits);
+ bitmap->bitmapbits = NULL;
return Ok;
}
@@ -426,6 +427,8 @@ GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
IPicture_get_CurDC(image->picture, &hdc);
DeleteDC(hdc);
IPicture_Release(image->picture);
+ if (image->type == ImageTypeBitmap)
+ GdipFree(((GpBitmap*)image)->bitmapbits);
GdipFree(image);
return Ok;
--
1.5.4.2
More information about the wine-patches
mailing list