On Thu, Aug 11, 2005 at 02:52:52PM +0200, Alexandre Julliard wrote:
Marcus Meissner marcus@jet.franken.de writes:
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.
Yes, but please don't use the IsBad* functions, use a proper exception handler.
Next try, is this what you imagined.
I now do a strlen() in GlobalAddAtomA(), however the compiler might optimize it away in the future (gcc 4.1 doesn't).
Ciao, Marcus
Changelog: Catch invalid strings in GlobalAddAtomA() using an exception handler.
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 14 Aug 2005 10:24:46 -0000 @@ -38,6 +38,8 @@ #include "winbase.h" #include "winerror.h"
+#include "wine/exception.h" +#include "excpt.h" #include "wine/server.h" #include "wine/unicode.h" #include "kernel_private.h" @@ -48,6 +50,14 @@
#define MAX_ATOM_LEN 255
+/* filter for page-fault exceptions */ +static WINE_EXCEPTION_FILTER(page_fault) +{ + if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) + return EXCEPTION_EXECUTE_HANDLER; + return EXCEPTION_CONTINUE_SEARCH; +} + static struct atom_table* get_local_table(DWORD entries) { static struct atom_table* local_table; @@ -183,6 +193,20 @@ */ ATOM WINAPI GlobalAddAtomA( LPCSTR str /* [in] String to add */ ) { + if (HIWORD(str)) { + __TRY { + char *s = (char*)str; + while (*s) s++; + /* FIXME: Should make sure the compiler does + * not throw away the above. + */ + } + __EXCEPT(page_fault) { + SetLastError( ERROR_INVALID_PARAMETER ); + return 0; + } + __ENDTRY + } return ATOM_AddAtomA( str, NULL ); }