From 19eea5fa6b27a99c3a3d565554b54edc3f26fc18 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 12 Oct 2010 23:24:11 +0200 Subject: [PATCH] user32: Improve error checking in GetIconInfo. --- dlls/user32/cursoricon.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 1d440dbd7af..82360a25928 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -285,19 +285,22 @@ static int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) */ static HBITMAP copy_bitmap( HBITMAP bitmap ) { - HDC src, dst; - HBITMAP new_bitmap; + HDC src, dst = 0; + HBITMAP new_bitmap = 0; BITMAP bmp; if (!bitmap) return 0; if (!GetObjectW( bitmap, sizeof(bmp), &bmp )) return 0; - src = CreateCompatibleDC( 0 ); - dst = CreateCompatibleDC( 0 ); - SelectObject( src, bitmap ); - new_bitmap = CreateCompatibleBitmap( src, bmp.bmWidth, bmp.bmHeight ); - SelectObject( dst, new_bitmap ); - BitBlt( dst, 0, 0, bmp.bmWidth, bmp.bmHeight, src, 0, 0, SRCCOPY ); + if ((src = CreateCompatibleDC( 0 )) && (dst = CreateCompatibleDC( 0 ))) + { + SelectObject( src, bitmap ); + if ((new_bitmap = CreateCompatibleBitmap( src, bmp.bmWidth, bmp.bmHeight ))) + { + SelectObject( dst, new_bitmap ); + BitBlt( dst, 0, 0, bmp.bmWidth, bmp.bmHeight, src, 0, 0, SRCCOPY ); + } + } DeleteDC( dst ); DeleteDC( src ); return new_bitmap; @@ -1685,6 +1688,7 @@ BOOL WINAPI GetIconInfoExA( HICON icon, ICONINFOEXA *info ) BOOL WINAPI GetIconInfoExW( HICON icon, ICONINFOEXW *info ) { struct cursoricon_object *ptr; + BOOL ret = TRUE; if (info->cbSize != sizeof(*info)) { @@ -1713,8 +1717,14 @@ BOOL WINAPI GetIconInfoExW( HICON icon, ICONINFOEXW *info ) if (IS_INTRESOURCE( ptr->resname )) info->wResID = LOWORD( ptr->resname ); else lstrcpynW( info->szResName, ptr->resname, MAX_PATH ); } + if (!info->hbmMask || (!info->hbmColor && ptr->frames[0].color)) + { + DeleteObject( info->hbmMask ); + DeleteObject( info->hbmColor ); + ret = FALSE; + } release_icon_ptr( icon, ptr ); - return TRUE; + return ret; } /* copy an icon bitmap, even when it can't be selected into a DC */ -- 2.11.4.GIT