From be8501ac6f1ecfa0e0e86a829939947f0cb82e7d Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Wed, 18 Aug 2021 12:36:32 +0300 Subject: [PATCH] user32: Check control type in the STM_SETIMAGE/STM_SETICON handlers before calling the helpers. Signed-off-by: Dmitry Timoshkov Signed-off-by: Alexandre Julliard --- dlls/user32/static.c | 7 ++- dlls/user32/tests/static.c | 121 ++++++++++++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 6 deletions(-) diff --git a/dlls/user32/static.c b/dlls/user32/static.c index 72e49e15e8f..35bdc2490c0 100644 --- a/dlls/user32/static.c +++ b/dlls/user32/static.c @@ -103,7 +103,6 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style ) HICON prevIcon; SIZE size; - if ((style & SS_TYPEMASK) != SS_ICON) return 0; if (hicon && !get_icon_size( hicon, &size )) { WARN("hicon != 0, but invalid\n"); @@ -138,7 +137,6 @@ static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style ) { HBITMAP hOldBitmap; - if ((style & SS_TYPEMASK) != SS_BITMAP) return 0; if (hBitmap && GetObjectType(hBitmap) != OBJ_BITMAP) { WARN("hBitmap != 0, but it's not a bitmap\n"); return 0; @@ -174,7 +172,6 @@ static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style ) */ static HENHMETAFILE STATIC_SetEnhMetaFile( HWND hwnd, HENHMETAFILE hEnhMetaFile, DWORD style ) { - if ((style & SS_TYPEMASK) != SS_ENHMETAFILE) return 0; if (hEnhMetaFile && GetObjectType(hEnhMetaFile) != OBJ_ENHMETAFILE) { WARN("hEnhMetaFile != 0, but it's not an enhanced metafile\n"); return 0; @@ -501,13 +498,16 @@ LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam case STM_SETIMAGE: switch(wParam) { case IMAGE_BITMAP: + if (style != SS_BITMAP) return 0; lResult = (LRESULT)STATIC_SetBitmap( hwnd, (HBITMAP)lParam, full_style ); break; case IMAGE_ENHMETAFILE: + if (style != SS_ENHMETAFILE) return 0; lResult = (LRESULT)STATIC_SetEnhMetaFile( hwnd, (HENHMETAFILE)lParam, full_style ); break; case IMAGE_ICON: case IMAGE_CURSOR: + if (style != SS_ICON) return 0; lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)lParam, full_style ); break; default: @@ -518,6 +518,7 @@ LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam break; case STM_SETICON: + if (style != SS_ICON) return 0; lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)wParam, full_style ); STATIC_TryPaintFcn( hwnd, full_style ); break; diff --git a/dlls/user32/tests/static.c b/dlls/user32/tests/static.c index 0c453d08a67..731e0f5df72 100644 --- a/dlls/user32/tests/static.c +++ b/dlls/user32/tests/static.c @@ -20,9 +20,11 @@ #include #include -#define STRICT -#define WIN32_LEAN_AND_MEAN -#include +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#define OEMRESOURCE +#include "winuser.h" #include "wine/test.h" @@ -189,6 +191,118 @@ static void test_set_image(void) DeleteObject(image); } +static void test_STM_SETIMAGE(void) +{ + DWORD type; + HWND hwnd; + HICON icon, old_image; + HBITMAP bmp; + HENHMETAFILE emf; + HDC dc; + + icon = LoadIconW(0, (LPCWSTR)IDI_APPLICATION); + bmp = LoadBitmapW(0, (LPCWSTR)OBM_CLOSE); + dc = CreateEnhMetaFileW(0, NULL, NULL, NULL); + LineTo(dc, 1, 1); + emf = CloseEnhMetaFile(dc); + DeleteDC(dc); + + for (type = SS_LEFT; type < SS_ETCHEDFRAME; type++) + { + winetest_push_context("%u", type); + + hwnd = build_static(type); + ok(hwnd != 0, "failed to create static type %#x\n", type); + + /* set icon */ + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)icon); + ok(!old_image, "got %p\n", old_image); + if (type == SS_ICON) + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + else + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)icon); + if (type == SS_ICON) + { + ok(old_image != 0, "got %p\n", old_image); + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + else + { + ok(!old_image, "got %p\n", old_image); + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETICON, (WPARAM)icon, 0); + if (type == SS_ICON) + { + ok(old_image != 0, "got %p\n", old_image); + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + else + { + ok(!old_image, "got %p\n", old_image); + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + + /* set bitmap */ + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp); + ok(!old_image, "got %p\n", old_image); + if (type == SS_BITMAP) + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + else + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bmp); + if (type == SS_BITMAP) + { + ok(old_image != 0, "got %p\n", old_image); + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + else + { + ok(!old_image, "got %p\n", old_image); + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + + /* set EMF */ + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)emf); + ok(!old_image, "got %p\n", old_image); + if (type == SS_ENHMETAFILE) + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + else + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + + g_nReceivedColorStatic = 0; + old_image = (HICON)SendMessageW(hwnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)emf); + if (type == SS_ENHMETAFILE) + { + ok(old_image != 0, "got %p\n", old_image); + ok(g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + else + { + ok(!old_image, "got %p\n", old_image); + ok(!g_nReceivedColorStatic, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + } + + DestroyWindow(hwnd); + + winetest_pop_context(); + } + + DestroyIcon(icon); + DeleteObject(bmp); + DeleteEnhMetaFile(emf); +} + START_TEST(static) { static const char szClassName[] = "testclass"; @@ -222,6 +336,7 @@ START_TEST(static) test_updates(SS_ETCHEDVERT, TODO_COUNT); test_set_text(); test_set_image(); + test_STM_SETIMAGE(); DestroyWindow(hMainWnd); }