Henri Verbeet : wined3d: Don' t depend on uninitialized data in the CreateSurface() thunks (Valgrind).
Alexandre Julliard
julliard at winehq.org
Thu Oct 29 11:20:38 CDT 2009
Module: wine
Branch: master
Commit: 052d955567864a7e0c9c51d726abb6ff6ebb0b95
URL: http://source.winehq.org/git/wine.git/?a=commit;h=052d955567864a7e0c9c51d726abb6ff6ebb0b95
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Thu Oct 29 10:37:13 2009 +0100
wined3d: Don't depend on uninitialized data in the CreateSurface() thunks (Valgrind).
Perhaps IDirectDraw7_CreateSurface() should also always set "pSurface7" to
NULL on failure, but at least for our internal functions that's a silly thing
to rely on.
---
dlls/ddraw/ddraw_thunks.c | 62 ++++++++++++++++++++------------------------
1 files changed, 28 insertions(+), 34 deletions(-)
diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index 8c79cbf..278d720 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -347,20 +347,18 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
* since the data layout is the same */
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
(LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
-
- /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
- * IDirectDrawSurface vtable layout at the beginning */
- *ppSurface = pSurface7 ?
- (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurface7)->IDirectDrawSurface3_vtbl : NULL;
-
- impl = (IDirectDrawSurfaceImpl *)pSurface7;
- if(SUCCEEDED(hr) && impl)
+ if (FAILED(hr))
{
- set_surf_version(impl, 1);
- IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
- impl->ifaceToRelease = NULL;
+ *ppSurface = NULL;
+ return hr;
}
+ impl = (IDirectDrawSurfaceImpl *)pSurface7;
+ *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
+ set_surf_version(impl, 1);
+ IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
+ impl->ifaceToRelease = NULL;
+
return hr;
}
@@ -375,20 +373,18 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
(LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
-
- /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
- * IDirectDrawSurface vtable layout at the beginning */
- *ppSurface = pSurface7 ?
- (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurface7)->IDirectDrawSurface3_vtbl : NULL;
-
- impl = (IDirectDrawSurfaceImpl *)pSurface7;
- if(SUCCEEDED(hr) && impl)
+ if (FAILED(hr))
{
- set_surf_version(impl, 2);
- IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
- impl->ifaceToRelease = NULL;
+ *ppSurface = NULL;
+ return hr;
}
+ impl = (IDirectDrawSurfaceImpl *)pSurface7;
+ *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
+ set_surf_version(impl, 2);
+ IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
+ impl->ifaceToRelease = NULL;
+
return hr;
}
@@ -403,21 +399,19 @@ IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
(LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
-
- /* This coercion is safe, since the IDirectDrawSurface3 vtable has the
- * IDirectDrawSurface vtable layout at the beginning */
- *ppSurface = pSurface7 ?
- (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurface7)->IDirectDrawSurface3_vtbl : NULL;
-
- impl = (IDirectDrawSurfaceImpl *)pSurface7;
- if(SUCCEEDED(hr) && impl)
+ if (FAILED(hr))
{
- set_surf_version(impl, 3);
- IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
- IDirectDraw3_AddRef(This);
- impl->ifaceToRelease = (IUnknown *) This;
+ *ppSurface = NULL;
+ return hr;
}
+ impl = (IDirectDrawSurfaceImpl *)pSurface7;
+ *ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
+ set_surf_version(impl, 3);
+ IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
+ IDirectDraw3_AddRef(This);
+ impl->ifaceToRelease = (IUnknown *) This;
+
return hr;
}
More information about the wine-cvs
mailing list