On Tue, Aug 09, 2005 at 12:13:22PM +0300, Saulius Krasuckas wrote:
- On Tue, 9 Aug 2005, Marcus Meissner wrote:
The Ikea kitchen planner passed 0xcccccccc for some reason and works much better after this patch.
It if uninitialized memory in a case of MSVC and MSVCRTD, I guess. BUUUUG in the app. :-)
(...RegisterClassExA calls GlobalAddAtomA...)
I had a look at the disassembly and yes, the program is buggy.
It has a function which goes like this:
func() { WNDCLASSA wca; WNDCLASSEXA wcexa;
/* inserted by compiler most likely */ memset(localstackspace, 0xCC, sizeoflocalstackspace);
... initialize fields of wca ... wcexa.cbSize = sizeof(wcexa); wcexa.hIconSm = LoadIconA(...);
RegisterClassA(&wca); RegisterClassExA(&wcexa);
... }
So wondering why it does not initialize anything of WNDCLASSEXA except cbSize and hIconSm ...
I think something in the function assumes that wca and wcexa overlap (since WNDCLASSEXA has this layout: UINT cbSize; WNDCLASSA wndclassastuff; HICON hIconSm;
I really would like to see the sourcecode of this one and how it is broken. ;) (Programmers of IKEA Kitchen Planner ... Please read.)
So ... now we can:
- fix this program by contacting the developers etc... which is difficult. - fix WINE by adding a check.
I can only fix WINE.
Ciao, Marcus
Index: dlls/kernel/atom.c =================================================================== RCS file: /home/wine/wine/dlls/kernel/atom.c,v retrieving revision 1.8 diff -u -r1.8 atom.c --- dlls/kernel/atom.c 10 May 2005 15:15:50 -0000 1.8 +++ dlls/kernel/atom.c 9 Aug 2005 06:55:47 -0000 @@ -183,6 +183,10 @@ */ ATOM WINAPI GlobalAddAtomA( LPCSTR str /* [in] String to add */ ) { + if (HIWORD(str) && IsBadStringPtrA(str, MAX_ATOM_LEN)) { + SetLastError( ERROR_INVALID_PARAMETER ); + return 0; + } return ATOM_AddAtomA( str, NULL ); }