From e4c2d6ba8c74451b4b8867ccad88ca12ffe39333 Mon Sep 17 00:00:00 2001 From: Jason Edmeades Date: Tue, 22 Feb 2005 14:56:28 +0000 Subject: [PATCH] Make RegisterClassExA check that reserved bytes is a valid value. Tests to confirm this behaviour. --- dlls/user/tests/class.c | 24 ++++++++++++++++++++++++ windows/class.c | 11 +++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/dlls/user/tests/class.c b/dlls/user/tests/class.c index f2dc853c61e..497c732482d 100644 --- a/dlls/user/tests/class.c +++ b/dlls/user/tests/class.c @@ -310,6 +310,7 @@ static void test_instances(void) cls.lpszMenuName = "main_module"; cls.hInstance = main_module; + ok( RegisterClassA( &cls ), "Failed to register local class for main module\n" ); check_class( main_module, name, "main_module" ); check_instance( name, main_module, main_module, main_module ); @@ -324,6 +325,29 @@ static void test_instances(void) check_thread_instance( name, kernel32, kernel32, kernel32 ); ok( UnregisterClassA( name, kernel32 ), "Unregister failed for kernel32\n" ); + /* Bug 2631 - Supplying an invalid number of bytes fails */ + cls.cbClsExtra = 0; + cls.cbWndExtra = -1; + SetLastError(0xdeadbeef); + ok( ((RegisterClassA( &cls ) == 0) && (GetLastError() == ERROR_INVALID_PARAMETER)), + "Failed with invalid number of WndExtra bytes\n"); + + cls.cbClsExtra = -1; + cls.cbWndExtra = 0; + SetLastError(0xdeadbeef); + ok( ((RegisterClassA( &cls ) == 0) && (GetLastError() == ERROR_INVALID_PARAMETER)), + "Failed with invalid number of ClsExtra bytes\n"); + + cls.cbClsExtra = -1; + cls.cbWndExtra = -1; + SetLastError(0xdeadbeef); + ok( ((RegisterClassA( &cls ) == 0) && (GetLastError() == ERROR_INVALID_PARAMETER)), + "Failed with invalid number of ClsExtra and cbWndExtra bytes\n"); + + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + SetLastError(0xdeadbeef); + /* setting global flag doesn't change status of class */ hwnd = CreateWindowExA( 0, name, "test", 0, 0, 0, 0, 0, 0, 0, main_module, 0 ); SetClassLongA( hwnd, GCL_STYLE, CS_GLOBALCLASS ); diff --git a/windows/class.c b/windows/class.c index 9b7ba67e2d3..608f2ed292e 100644 --- a/windows/class.c +++ b/windows/class.c @@ -379,11 +379,14 @@ static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE hInstance, BOOL local, /* Fix the extra bytes value */ - if (classExtra < 0) classExtra = 0; - else if (classExtra > 40) /* Extra bytes are limited to 40 in Win32 */ + if (classExtra < 0 || winExtra < 0) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return NULL; + } + if (classExtra > 40) /* Extra bytes are limited to 40 in Win32 */ WARN("Class extra bytes %d is > 40\n", classExtra); - if (winExtra < 0) winExtra = 0; - else if (winExtra > 40) /* Extra bytes are limited to 40 in Win32 */ + if (winExtra > 40) /* Extra bytes are limited to 40 in Win32 */ WARN("Win extra bytes %d is > 40\n", winExtra ); classPtr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CLASS) + classExtra );