ddraw: make some driver info not const

Rein Klazes wijn at wanadoo.nl
Sun Dec 4 05:53:39 CST 2005


On Sat, 3 Dec 2005 09:44:07 +0100, you wrote:


>> This is wrong. No user program should modify our internal data. I think
>> you need to copy this data into heap before passing it to the app. You
>> should make simple test to check if the data returned on windows is
>> within heap or not.
>
>Yeah, I agree with Vitaliy here... We were alread hit multiple times by this
>bug in other cases: Wine should never send to the application actual private
>data as many games expect to use these values to do actual processing.

OK, I have tested this under Windows. The data is protected and the
access violation is handled by DirectDrawEnumerate:

Changelog:
dlls/ddraw	: main.c, Makefile.in
Catch access violations when calling the DirectDrawEnumerateProc.

Rein.
-------------- next part --------------
--- wine/dlls/ddraw/main.c	2005-08-09 15:31:06.000000000 +0200
+++ mywine/dlls/ddraw/main.c	2005-12-04 11:48:47.000000000 +0100
@@ -39,6 +39,8 @@
 #include "winnls.h"
 #include "winerror.h"
 #include "wingdi.h"
+#include "wine/exception.h"
+#include "excpt.h"
 
 #include "ddraw.h"
 #include "d3d.h"
@@ -62,6 +64,14 @@ void (*wine_tsx11_unlock_ptr)(void) = NU
 
 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
 
+/* filter for page-fault exceptions */
+static WINE_EXCEPTION_FILTER(page_fault)
+{
+    if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
+        return EXCEPTION_EXECUTE_HANDLER;
+    return EXCEPTION_CONTINUE_SEARCH;
+}
+
 /**********************************************************************/
 
 typedef struct {
@@ -201,12 +211,20 @@ HRESULT WINAPI DirectDrawEnumerateExA(
 
 	/* We have to pass NULL from the primary display device.
 	 * RoadRage chapter 6's enumeration routine expects it. */
+        __TRY
+        {
 	if (!lpCallback((DDRAW_default_driver == i) ? NULL
 			:(LPGUID)&DDRAW_drivers[i]->info->guidDeviceIdentifier,
 			(LPSTR)DDRAW_drivers[i]->info->szDescription,
 			(LPSTR)DDRAW_drivers[i]->info->szDriver,
 			lpContext, 0))
 	    return DD_OK;
+        }
+        __EXCEPT(page_fault)
+        {
+            return E_INVALIDARG;
+        }
+        __ENDTRY
     }
 
     /* Unsupported flags */
--- wine/dlls/ddraw/Makefile.in	2005-06-07 12:10:50.000000000 +0200
+++ mywine/dlls/ddraw/Makefile.in	2005-12-04 11:26:37.000000000 +0100
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = ddraw.dll
 IMPORTLIB = libddraw.$(IMPLIBEXT)
-IMPORTS   = ole32 user32 gdi32 advapi32 kernel32
+IMPORTS   = ole32 user32 gdi32 advapi32 kernel32 ntdll
 EXTRAINCL = @X_CFLAGS@
 EXTRALIBS = -ldxguid -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ 
 


More information about the wine-devel mailing list