[PATCH 09/10] ddraw: Add checking of SURFACEDESC type into CreateSurface methods. (try 3)
Oldřich Jedlička
oldium.pro at seznam.cz
Tue Aug 3 14:26:22 CDT 2010
---
dlls/ddraw/ddraw.c | 30 ++++++++++++++++
dlls/ddraw/tests/dsurface.c | 80 +++++++++++++------------------------------
2 files changed, 54 insertions(+), 56 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index f32ec78..bfc9c6d 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -3404,6 +3404,12 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface,
TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
iface, surface_desc, surface, outer_unknown);
+ if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC2))
+ {
+ WARN("Application supplied invalid surface descriptor\n");
+ return DDERR_INVALIDPARAMS;
+ }
+
if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
{
if (TRACE_ON(ddraw))
@@ -3429,6 +3435,12 @@ static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface,
TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
iface, surface_desc, surface, outer_unknown);
+ if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC2))
+ {
+ WARN("Application supplied invalid surface descriptor\n");
+ return DDERR_INVALIDPARAMS;
+ }
+
if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
{
if (TRACE_ON(ddraw))
@@ -3465,6 +3477,12 @@ static HRESULT WINAPI ddraw3_CreateSurface(IDirectDraw3 *iface,
TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
iface, surface_desc, surface, outer_unknown);
+ if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC))
+ {
+ WARN("Application supplied invalid surface descriptor\n");
+ return DDERR_INVALIDPARAMS;
+ }
+
if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
{
if (TRACE_ON(ddraw))
@@ -3505,6 +3523,12 @@ static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface,
TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
iface, surface_desc, surface, outer_unknown);
+ if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC))
+ {
+ WARN("Application supplied invalid surface descriptor\n");
+ return DDERR_INVALIDPARAMS;
+ }
+
if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
{
if (TRACE_ON(ddraw))
@@ -3544,6 +3568,12 @@ static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface,
TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
iface, surface_desc, surface, outer_unknown);
+ if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC))
+ {
+ WARN("Application supplied invalid surface descriptor\n");
+ return DDERR_INVALIDPARAMS;
+ }
+
/* Remove front buffer flag, this causes failure in v7, and its added to normal
* primaries anyway. */
surface_desc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index a6dad72..2cf9103 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -3627,28 +3627,20 @@ static void CreateSurfaceBadCapsSizeTest(void)
IDirectDrawSurface_Release(surf);
hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad1, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad2, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad3, &surf, NULL);
ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad4, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ DDERR_INVALIDPARAMS, hr);
+ hr = IDirectDraw_CreateSurface(lpDD, NULL, &surf, NULL);
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
- __TRY
- {
- hr = IDirectDraw_CreateSurface(lpDD, NULL, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n",
- DDERR_INVALIDPARAMS, hr);
- }
- __EXCEPT_PAGE_FAULT
- {
- todo_wine ok(FALSE, "IDirectDraw_CreateSurface dereferenced NULL pointer\n");
- }
- __ENDTRY
hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2);
ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr);
@@ -3658,28 +3650,20 @@ static void CreateSurfaceBadCapsSizeTest(void)
IDirectDrawSurface_Release(surf);
hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad1, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad2, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad3, &surf, NULL);
ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad4, &surf, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ DDERR_INVALIDPARAMS, hr);
+ hr = IDirectDraw2_CreateSurface(dd2, NULL, &surf, NULL);
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
- __TRY
- {
- hr = IDirectDraw2_CreateSurface(dd2, NULL, &surf, NULL);
- ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n",
- DDERR_INVALIDPARAMS, hr);
- }
- __EXCEPT_PAGE_FAULT
- {
- todo_wine ok(FALSE, "IDirectDraw2_CreateSurface dereferenced NULL pointer\n");
- }
- __ENDTRY
IDirectDraw2_Release(dd2);
@@ -3691,28 +3675,20 @@ static void CreateSurfaceBadCapsSizeTest(void)
IDirectDrawSurface4_Release(surf4);
hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad1, &surf4, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad2, &surf4, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad3, &surf4, NULL);
ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad4, &surf4, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ DDERR_INVALIDPARAMS, hr);
+ hr = IDirectDraw4_CreateSurface(dd4, NULL, &surf4, NULL);
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
- __TRY
- {
- hr = IDirectDraw4_CreateSurface(dd4, NULL, &surf4, NULL);
- ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n",
- DDERR_INVALIDPARAMS, hr);
- }
- __EXCEPT_PAGE_FAULT
- {
- todo_wine ok(FALSE, "IDirectDraw4_CreateSurface dereferenced NULL pointer\n");
- }
- __ENDTRY
IDirectDraw4_Release(dd4);
@@ -3724,29 +3700,21 @@ static void CreateSurfaceBadCapsSizeTest(void)
IDirectDrawSurface7_Release(surf7);
hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad1, &surf7, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad2, &surf7, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad3, &surf7, NULL);
ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad4, &surf7, NULL);
- todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
DDERR_INVALIDPARAMS, hr);
- __TRY
- {
- hr = IDirectDraw7_CreateSurface(dd7, NULL, &surf7, NULL);
- ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
- DDERR_INVALIDPARAMS, hr);
- }
- __EXCEPT_PAGE_FAULT
- {
- todo_wine ok(FALSE, "IDirectDraw7_CreateSurface dereferenced NULL pointer\n");
- }
- __ENDTRY
+ hr = IDirectDraw7_CreateSurface(dd7, NULL, &surf7, NULL);
+ ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n",
+ DDERR_INVALIDPARAMS, hr);
IDirectDraw7_Release(dd7);
}
--
1.7.2
More information about the wine-patches
mailing list