Module: wine Branch: master Commit: ee57e19b40ec60aa4481ca2e313736f4f6ed5d50 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ee57e19b40ec60aa4481ca2e31...
Author: Stefan Dösinger stefan@codeweavers.com Date: Mon Apr 7 22:27:32 2014 +0200
ddraw: SetPrivateData(..., data = NULL, ...) is not valid.
---
dlls/ddraw/surface.c | 6 ++++++ dlls/ddraw/tests/ddraw4.c | 9 +++++++++ dlls/ddraw/tests/ddraw7.c | 9 +++++++++ 3 files changed, 24 insertions(+)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 5cfec01..5717956 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -2254,6 +2254,12 @@ static HRESULT WINAPI ddraw_surface7_SetPrivateData(IDirectDrawSurface7 *iface, TRACE("iface %p, tag %s, data %p, data_size %u, flags %#x.\n", iface, debugstr_guid(tag), data, size, flags);
+ if (!data) + { + WARN("data is NULL, returning DDERR_INVALIDPARAMS.\n"); + return DDERR_INVALIDPARAMS; + } + wined3d_mutex_lock(); hr = wined3d_private_store_set_private_data(&surface->private_store, tag, data, size, flags); wined3d_mutex_unlock(); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 716dc43..be965dc 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -6103,6 +6103,15 @@ static void test_private_data(void) hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+ /* NULL pointers are not valid, but don't cause a crash. */ + hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, + sizeof(IUnknown *), DDSPD_IUNKNOWNPOINTER); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 1, 0); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + /* DDSPD_IUNKNOWNPOINTER needs sizeof(IUnknown *) bytes of data. */ hr = IDirectDrawSurface4_SetPrivateData(surface, &ddraw_private_data_test_guid, ddraw, 0, DDSPD_IUNKNOWNPOINTER); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 31d552d..940d28b 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -5958,6 +5958,15 @@ static void test_private_data(void) hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+ /* NULL pointers are not valid, but don't cause a crash. */ + hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, + sizeof(IUnknown *), DDSPD_IUNKNOWNPOINTER); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 0, 0); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 1, 0); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + /* DDSPD_IUNKNOWNPOINTER needs sizeof(IUnknown *) bytes of data. */ hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, ddraw, 0, DDSPD_IUNKNOWNPOINTER);