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 );
 }
 

Reply via email to