[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