Fix memory leak in set_custom_mouse_cursor

This commit is contained in:
Guilherme Felipe 2018-05-26 15:58:12 -03:00
parent c0d3712305
commit aa174d963d
3 changed files with 17 additions and 5 deletions

View file

@ -1546,7 +1546,7 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
image = texture->get_data(); image = texture->get_data();
NSBitmapImageRep *imgrep = [[[NSBitmapImageRep alloc] NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL initWithBitmapDataPlanes:NULL
pixelsWide:int(texture_size.width) pixelsWide:int(texture_size.width)
pixelsHigh:int(texture_size.height) pixelsHigh:int(texture_size.height)
@ -1556,7 +1556,7 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
isPlanar:NO isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:int(texture_size.width) * 4 bytesPerRow:int(texture_size.width) * 4
bitsPerPixel:32] autorelease]; bitsPerPixel:32];
ERR_FAIL_COND(imgrep == nil); ERR_FAIL_COND(imgrep == nil);
uint8_t *pixels = [imgrep bitmapData]; uint8_t *pixels = [imgrep bitmapData];
@ -1588,16 +1588,20 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
image->unlock(); image->unlock();
NSImage *nsimage = [[[NSImage alloc] initWithSize:NSMakeSize(texture_size.width, texture_size.height)] autorelease]; NSImage *nsimage = [[NSImage alloc] initWithSize:NSMakeSize(texture_size.width, texture_size.height)];
[nsimage addRepresentation:imgrep]; [nsimage addRepresentation:imgrep];
NSCursor *cursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSMakePoint(p_hotspot.x, p_hotspot.y)]; NSCursor *cursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSMakePoint(p_hotspot.x, p_hotspot.y)];
[cursors[p_shape] release];
cursors[p_shape] = cursor; cursors[p_shape] = cursor;
if (p_shape == CURSOR_ARROW) { if (p_shape == CURSOR_ARROW) {
[cursor set]; [cursor set];
} }
[imgrep release];
[nsimage release];
} else { } else {
// Reset to default system cursor // Reset to default system cursor
cursors[p_shape] = NULL; cursors[p_shape] = NULL;

View file

@ -2081,7 +2081,7 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
UINT size = sizeof(UINT) * image_size; UINT size = sizeof(UINT) * image_size;
// Create the BITMAP with alpha channel // Create the BITMAP with alpha channel
COLORREF *buffer = (COLORREF *)malloc(sizeof(COLORREF) * image_size); COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size);
image->lock(); image->lock();
for (UINT index = 0; index < image_size; index++) { for (UINT index = 0; index < image_size; index++) {
@ -2108,6 +2108,8 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
GetMaskBitmaps(bitmap, clrTransparent, hAndMask, hXorMask); GetMaskBitmaps(bitmap, clrTransparent, hAndMask, hXorMask);
if (NULL == hAndMask || NULL == hXorMask) { if (NULL == hAndMask || NULL == hXorMask) {
memfree(buffer);
DeleteObject(bitmap);
return; return;
} }
@ -2132,6 +2134,9 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
if (hXorMask != NULL) { if (hXorMask != NULL) {
DeleteObject(hXorMask); DeleteObject(hXorMask);
} }
memfree(buffer);
DeleteObject(bitmap);
} else { } else {
// Reset to default system cursor // Reset to default system cursor
cursors[p_shape] = NULL; cursors[p_shape] = NULL;

View file

@ -2463,7 +2463,7 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
cursor_image->yhot = p_hotspot.y; cursor_image->yhot = p_hotspot.y;
// allocate memory to contain the whole file // allocate memory to contain the whole file
cursor_image->pixels = (XcursorPixel *)malloc(size); cursor_image->pixels = (XcursorPixel *)memalloc(size);
image->lock(); image->lock();
@ -2489,6 +2489,9 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
if (p_shape == CURSOR_ARROW) { if (p_shape == CURSOR_ARROW) {
XDefineCursor(x11_display, x11_window, cursors[p_shape]); XDefineCursor(x11_display, x11_window, cursors[p_shape]);
} }
memfree(cursor_image->pixels);
XcursorImageDestroy(cursor_image);
} else { } else {
// Reset to default system cursor // Reset to default system cursor
if (img[p_shape]) { if (img[p_shape]) {