ddraw: Return a nullpointer as lpSurface in Lock() if the rect is invalid.
This commit is contained in:
parent
d6a8b5024a
commit
df5116cc7d
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue