[ddraw] Fix bug 3487

Peter Berg Larsen pebl at math.ku.dk
Sat Oct 8 20:43:06 CDT 2005


Pure luck to find this one. I didnt understand what was going on;
and rewrote it. I am still uncertain about invariants wrt. sizeof
and dwSize.

Changelog:
 	Bug in copying structs if to == from as to was memset first.


diff -u Wine-20050930/dlls/ddraw/ddraw_private.h Wine-20050930my/dlls/ddraw/ddraw_private.h
--- Wine-20050930/dlls/ddraw/ddraw_private.h	2005-07-24 18:17:29.000000000 +0200
+++ Wine-20050930my/dlls/ddraw/ddraw_private.h	2005-10-09 03:31:08.000000000 +0200
@@ -43,16 +43,19 @@

  #define DD_STRUCT_COPY_BYSIZE(to,from)			\
  	do {						\
-	    	DWORD __size = (to)->dwSize;		\
-	    	DWORD __copysize = __size;		\
-	    	DWORD __resetsize = __size;		\
-	        if (__resetsize > sizeof(*to))		\
-		    __resetsize = sizeof(*to);		\
-	    	memset(to,0,__resetsize);               \
-	        if ((from)->dwSize < __size) 		\
-		    __copysize = (from)->dwSize;	\
-		memcpy(to,from,__copysize);		\
-		(to)->dwSize = __size;/*restore size*/	\
+		DWORD __tosize = (to)->dwSize;		\
+		DWORD __fromsize = (from)->dwSize;	\
+		if ((to) == (from))			\
+		    break;				\
+		if (__tosize > sizeof(*(to)))		\
+		    ERR("To struct's size too large");	\
+		if (__fromsize > sizeof(*(from)))	\
+		    ERR("From struct's size too large");\
+		if (__fromsize > __tosize)		\
+		    ERR("Copying too large struct");	\
+		memcpy(to,from,__fromsize);		\
+		memset(to+__fromsize,0,__tosize-__fromsize);    \
+		(to)->dwSize = __tosize;/*restore size*/\
  	} while (0)

  #define MAKE_FOURCC(a,b,c,d) ((a << 0) | (b << 8) | (c << 16) | (d << 24))



More information about the wine-patches mailing list