From 8e79a7e6644fd6f1e0cfeb8b826e683d171d723a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20D=C3=B6singer?= Date: Sat, 3 Sep 2011 21:06:11 +0200 Subject: [PATCH] ddraw: Add some NULL pointer tests. --- dlls/ddraw/ddraw.c | 36 ++++++++++++------------- dlls/ddraw/surface.c | 26 +++++++++++------- dlls/ddraw/tests/ddrawmodes.c | 4 +++ dlls/ddraw/tests/dsurface.c | 62 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 27 deletions(-) diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 038ad188403..24d3647f153 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -2308,9 +2308,9 @@ static HRESULT WINAPI ddraw3_EnumDisplayModes(IDirectDraw3 *iface, DWORD flags, cbcontext.func = callback; cbcontext.context = context; - DDSD_to_DDSD2(surface_desc, &surface_desc2); - return ddraw7_EnumDisplayModes(&This->IDirectDraw7_iface, flags, &surface_desc2, - &cbcontext, EnumDisplayModesCallbackThunk); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); + return ddraw7_EnumDisplayModes(&This->IDirectDraw7_iface, flags, + surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumDisplayModesCallbackThunk); } static HRESULT WINAPI ddraw2_EnumDisplayModes(IDirectDraw2 *iface, DWORD flags, @@ -2326,9 +2326,9 @@ static HRESULT WINAPI ddraw2_EnumDisplayModes(IDirectDraw2 *iface, DWORD flags, cbcontext.func = callback; cbcontext.context = context; - DDSD_to_DDSD2(surface_desc, &surface_desc2); - return ddraw7_EnumDisplayModes(&This->IDirectDraw7_iface, flags, &surface_desc2, - &cbcontext, EnumDisplayModesCallbackThunk); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); + return ddraw7_EnumDisplayModes(&This->IDirectDraw7_iface, flags, + surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumDisplayModesCallbackThunk); } static HRESULT WINAPI ddraw1_EnumDisplayModes(IDirectDraw *iface, DWORD flags, @@ -2344,9 +2344,9 @@ static HRESULT WINAPI ddraw1_EnumDisplayModes(IDirectDraw *iface, DWORD flags, cbcontext.func = callback; cbcontext.context = context; - DDSD_to_DDSD2(surface_desc, &surface_desc2); - return ddraw7_EnumDisplayModes(&This->IDirectDraw7_iface, flags, &surface_desc2, - &cbcontext, EnumDisplayModesCallbackThunk); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); + return ddraw7_EnumDisplayModes(&This->IDirectDraw7_iface, flags, + surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumDisplayModesCallbackThunk); } /***************************************************************************** @@ -3730,9 +3730,9 @@ static HRESULT WINAPI ddraw3_EnumSurfaces(IDirectDraw3 *iface, DWORD flags, cbcontext.func = callback; cbcontext.context = context; - DDSD_to_DDSD2(surface_desc, &surface_desc2); - return ddraw7_EnumSurfaces(&This->IDirectDraw7_iface, flags, &surface_desc2, - &cbcontext, EnumSurfacesCallbackThunk); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); + return ddraw7_EnumSurfaces(&This->IDirectDraw7_iface, flags, + surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumSurfacesCallbackThunk); } static HRESULT WINAPI ddraw2_EnumSurfaces(IDirectDraw2 *iface, DWORD flags, @@ -3748,9 +3748,9 @@ static HRESULT WINAPI ddraw2_EnumSurfaces(IDirectDraw2 *iface, DWORD flags, cbcontext.func = callback; cbcontext.context = context; - DDSD_to_DDSD2(surface_desc, &surface_desc2); - return ddraw7_EnumSurfaces(&This->IDirectDraw7_iface, flags, &surface_desc2, - &cbcontext, EnumSurfacesCallbackThunk); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); + return ddraw7_EnumSurfaces(&This->IDirectDraw7_iface, flags, + surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumSurfacesCallbackThunk); } static HRESULT WINAPI ddraw1_EnumSurfaces(IDirectDraw *iface, DWORD flags, @@ -3766,9 +3766,9 @@ static HRESULT WINAPI ddraw1_EnumSurfaces(IDirectDraw *iface, DWORD flags, cbcontext.func = callback; cbcontext.context = context; - DDSD_to_DDSD2(surface_desc, &surface_desc2); - return ddraw7_EnumSurfaces(&This->IDirectDraw7_iface, flags, &surface_desc2, - &cbcontext, EnumSurfacesCallbackThunk); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); + return ddraw7_EnumSurfaces(&This->IDirectDraw7_iface, flags, + surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumSurfacesCallbackThunk); } /***************************************************************************** diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index fecda890c7c..abe3eed8e44 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -2938,9 +2938,9 @@ static HRESULT WINAPI ddraw_surface3_Initialize(IDirectDrawSurface3 *iface, DDSURFACEDESC2 surface_desc2; TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc); - DDSD_to_DDSD2(surface_desc, &surface_desc2); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); return ddraw_surface7_Initialize(&This->IDirectDrawSurface7_iface, - ddraw, &surface_desc2); + ddraw, surface_desc ? &surface_desc2 : NULL); } static HRESULT WINAPI ddraw_surface2_Initialize(IDirectDrawSurface2 *iface, @@ -2950,9 +2950,9 @@ static HRESULT WINAPI ddraw_surface2_Initialize(IDirectDrawSurface2 *iface, DDSURFACEDESC2 surface_desc2; TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc); - DDSD_to_DDSD2(surface_desc, &surface_desc2); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); return ddraw_surface7_Initialize(&This->IDirectDrawSurface7_iface, - ddraw, &surface_desc2); + ddraw, surface_desc ? &surface_desc2 : NULL); } static HRESULT WINAPI ddraw_surface1_Initialize(IDirectDrawSurface *iface, @@ -2962,9 +2962,9 @@ static HRESULT WINAPI ddraw_surface1_Initialize(IDirectDrawSurface *iface, DDSURFACEDESC2 surface_desc2; TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc); - DDSD_to_DDSD2(surface_desc, &surface_desc2); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); return ddraw_surface7_Initialize(&This->IDirectDrawSurface7_iface, - ddraw, &surface_desc2); + ddraw, surface_desc ? &surface_desc2 : NULL); } /***************************************************************************** @@ -3873,8 +3873,16 @@ static HRESULT WINAPI ddraw_surface7_SetSurfaceDesc(IDirectDrawSurface7 *iface, TRACE("iface %p, surface_desc %p, flags %#x.\n", iface, DDSD, Flags); - if(!DDSD) + if (!DDSD) + { + WARN("DDSD is NULL, returning DDERR_INVALIDPARAMS\n"); + return DDERR_INVALIDPARAMS; + } + if (Flags) + { + WARN("Flags is %x, returning DDERR_INVALIDPARAMS\n", Flags); return DDERR_INVALIDPARAMS; + } EnterCriticalSection(&ddraw_cs); if (DDSD->dwFlags & DDSD_PIXELFORMAT) @@ -3957,9 +3965,9 @@ static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface, DDSURFACEDESC2 surface_desc2; TRACE("iface %p, surface_desc %p, flags %#x.\n", iface, surface_desc, flags); - DDSD_to_DDSD2(surface_desc, &surface_desc2); + if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2); return ddraw_surface7_SetSurfaceDesc(&This->IDirectDrawSurface7_iface, - &surface_desc2, flags); + surface_desc ? &surface_desc2 : NULL, flags); } /***************************************************************************** diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c index 81ff43e1ea3..5cc80edcaa4 100644 --- a/dlls/ddraw/tests/ddrawmodes.c +++ b/dlls/ddraw/tests/ddrawmodes.c @@ -501,8 +501,12 @@ static void enumdisplaymodes(void) ok(rc==DD_OK,"EnumDisplayModes returned: %x\n",rc); ok(modes16bpp_cnt == refresh_count, "Expected %d modes got %d\n", refresh_count, modes16bpp_cnt); } + + rc = IDirectDraw_EnumDisplayModes(lpDD, 0, NULL, 0, enummodescallback); + ok(rc==DD_OK, "EnumDisplayModes returned: %x\n",rc); } + static void setdisplaymode(int i) { HRESULT rc; diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index 38f579c4675..a300d5e9cea 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -1217,6 +1217,11 @@ static void EnumTest(void) ok(rc == DD_OK, "IDirectDraw_EnumSurfaces returned %08x\n", rc); ok(ctx.count == 3, "%d surfaces enumerated, expected 3\n", ctx.count); + ctx.count = 0; + rc = IDirectDraw_EnumSurfaces(lpDD, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, &ctx, enumCB); + ok(rc == DD_OK, "IDirectDraw_EnumSurfaces returned %08x\n", rc); + ok(ctx.count == 3, "%d surfaces enumerated, expected 3\n", ctx.count); + IDirectDrawSurface_Release(ctx.expected[2]); IDirectDrawSurface_Release(ctx.expected[1]); IDirectDrawSurface_Release(surface); @@ -1944,6 +1949,10 @@ static void test_lockrect_invalid(void) continue; } + hr = IDirectDrawSurface_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL); + ok(hr == DDERR_INVALIDPARAMS, "Lock returned 0x%08x for NULL DDSURFACEDESC," + " expected DDERR_INVALIDPARAMS (0x%08x)\n", hr, DDERR_INVALIDPARAMS); + for (i = 0; i < (sizeof(valid) / sizeof(*valid)); ++i) { RECT *rect = &valid[i]; @@ -4216,6 +4225,58 @@ static void pixelformat_flag_test(void) test_ddsd(&ddsd, FALSE, TRUE, "Z buffer"); } +static void set_surface_desc_test(void) +{ + HRESULT hr; + DDSURFACEDESC ddsd; + IDirectDrawSurface *surface; + IDirectDrawSurface3 *surface3; + BYTE data[8*8*4]; + + hr = IDirectDraw_CreateSurface(lpDD, NULL, &surface, NULL); + ok(hr == DDERR_INVALIDPARAMS, "CreateSurface with a NULL DDSD returned %#x," + " expected DDERR_INVALIDPARAMS(%#x)\n", hr, DDERR_INVALIDPARAMS); + + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT; + ddsd.dwWidth = 8; + ddsd.dwHeight = 8; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32; + U2(ddsd.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x000000ff; + ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; + + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface, NULL); + ok(SUCCEEDED(hr), "IDirectDraw_CreateSurface failed, hr %#x.\n", hr); + + hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface3, (void **) &surface3); + ok(SUCCEEDED(hr), "IDirectDrawSurface_QueryInterface failed, hr %#x.\n", hr); + IDirectDrawSurface_Release(surface); + + reset_ddsd(&ddsd); + ddsd.dwFlags = DDSD_LPSURFACE; + ddsd.lpSurface = data; + hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); + ok(SUCCEEDED(hr), "IDirectDrawSurface3_SetSurfaceDesc failed, hr %#x.\n", hr); + + /* Redundantly setting the same lpSurface is not an error */ + hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 0); + ok(SUCCEEDED(hr), "IDirectDrawSurface3_SetSurfaceDesc failed, hr %#x.\n", hr); + + hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, &ddsd, 1); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface3_SetSurfaceDesc returned %#x, expected" + " DDERR_INVALIDPARAMS(%#x)\n", hr, DDERR_INVALIDPARAMS); + + hr = IDirectDrawSurface3_SetSurfaceDesc(surface3, NULL, 0); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface3_SetSurfaceDesc returned %#x, expected" + " DDERR_INVALIDPARAMS(%#x)\n", hr, DDERR_INVALIDPARAMS); + + IDirectDrawSurface_Release(surface3); +} + START_TEST(dsurface) { HRESULT ret; @@ -4275,5 +4336,6 @@ START_TEST(dsurface) no_ddsd_caps_test(); zbufferbitdepth_test(); pixelformat_flag_test(); + set_surface_desc_test(); ReleaseDirectDraw(); } -- 2.11.4.GIT