Stefan Dösinger : d3d8: Don' t validate 2D texture lock coordinates.
Module: wine Branch: stable Commit: a302e5872ed28242bd70588dcf00fc49164f3fde URL: http://source.winehq.org/git/wine.git/?a=commit;h=a302e5872ed28242bd70588dcf... Author: Stefan Dösinger <stefandoesinger(a)gmx.at> Date: Mon Jan 18 22:20:05 2016 +0000 d3d8: Don't validate 2D texture lock coordinates. Signed-off-by: Stefan Dösinger <stefandoesinger(a)gmx.at> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> (cherry picked from commit a2d3b3a5a58cdacb8bf09cb927a3421d9e3cc32a) Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> --- dlls/d3d8/surface.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c index 679f094..ec263b1 100644 --- a/dlls/d3d8/surface.c +++ b/dlls/d3d8/surface.c @@ -204,26 +204,36 @@ static HRESULT WINAPI d3d8_surface_LockRect(IDirect3DSurface8 *iface, struct wined3d_box box; struct wined3d_map_desc map_desc; HRESULT hr; + D3DRESOURCETYPE type; TRACE("iface %p, locked_rect %p, rect %s, flags %#x.\n", iface, locked_rect, wine_dbgstr_rect(rect), flags); wined3d_mutex_lock(); + + if (surface->texture) + type = IDirect3DBaseTexture8_GetType(&surface->texture->IDirect3DBaseTexture8_iface); + else + type = D3DRTYPE_SURFACE; + if (rect) { D3DSURFACE_DESC desc; IDirect3DSurface8_GetDesc(iface, &desc); - if ((rect->left < 0) + if (type != D3DRTYPE_TEXTURE + && ((rect->left < 0) || (rect->top < 0) || (rect->left >= rect->right) || (rect->top >= rect->bottom) || (rect->right > desc.Width) - || (rect->bottom > desc.Height)) + || (rect->bottom > desc.Height))) { WARN("Trying to lock an invalid rectangle, returning D3DERR_INVALIDCALL\n"); wined3d_mutex_unlock(); + locked_rect->Pitch = 0; + locked_rect->pBits = NULL; return D3DERR_INVALIDCALL; } box.left = rect->left; @@ -243,7 +253,7 @@ static HRESULT WINAPI d3d8_surface_LockRect(IDirect3DSurface8 *iface, locked_rect->Pitch = map_desc.row_pitch; locked_rect->pBits = map_desc.data; } - else + else if (type != D3DRTYPE_TEXTURE) { locked_rect->Pitch = 0; locked_rect->pBits = NULL;
participants (1)
-
Alexandre Julliard