ddraw: Return a nullpointer as lpSurface in Lock() if the rect is invalid.

This commit is contained in:
Günther Brammer 2008-02-25 16:22:41 +01:00 committed by Alexandre Julliard
parent d6a8b5024a
commit df5116cc7d
2 changed files with 22 additions and 14 deletions

View File

@ -577,20 +577,6 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface,
/* This->surface_desc.dwWidth and dwHeight are changeable, thus lock */
EnterCriticalSection(&ddraw_cs);
if (Rect)
{
if ((Rect->left < 0)
|| (Rect->top < 0)
|| (Rect->left > Rect->right)
|| (Rect->top > Rect->bottom)
|| (Rect->right > This->surface_desc.dwWidth)
|| (Rect->bottom > This->surface_desc.dwHeight))
{
WARN("Trying to lock an invalid rectangle, returning DDERR_INVALIDPARAMS\n");
LeaveCriticalSection(&ddraw_cs);
return DDERR_INVALIDPARAMS;
}
}
/* Should I check for the handle to be NULL?
*
@ -606,6 +592,24 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface,
return DDERR_INVALIDPARAMS;
}
/* Windows zeroes this if the rect is invalid */
DDSD->lpSurface = 0;
if (Rect)
{
if ((Rect->left < 0)
|| (Rect->top < 0)
|| (Rect->left > Rect->right)
|| (Rect->top > Rect->bottom)
|| (Rect->right > This->surface_desc.dwWidth)
|| (Rect->bottom > This->surface_desc.dwHeight))
{
WARN("Trying to lock an invalid rectangle, returning DDERR_INVALIDPARAMS\n");
LeaveCriticalSection(&ddraw_cs);
return DDERR_INVALIDPARAMS;
}
}
hr = IWineD3DSurface_LockRect(This->WineD3DSurface,
&LockedRect,
Rect,

View File

@ -1652,10 +1652,14 @@ static void test_lockrect_invalid(void)
{
RECT *rect = &invalid[i];
memset(&locked_desc, 1, sizeof(locked_desc));
locked_desc.dwSize = sizeof(locked_desc);
hr = IDirectDrawSurface_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
ok(hr == DDERR_INVALIDPARAMS, "Lock returned 0x%08x for rect [%d, %d]->[%d, %d]"
", expected DDERR_INVALIDPARAMS (0x%08x)\n", hr, rect->left, rect->top,
rect->right, rect->bottom, DDERR_INVALIDPARAMS);
ok(!locked_desc.lpSurface, "IDirectDrawSurface_Lock did not set lpSurface in the surface desc to zero.\n");
}
hr = IDirectDrawSurface_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);