=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: d3d8: Don' t validate 2D texture lock coordinates.

Alexandre Julliard julliard at winehq.org
Fri Oct 7 15:09:14 CDT 2016


Module: wine
Branch: stable
Commit: a302e5872ed28242bd70588dcf00fc49164f3fde
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a302e5872ed28242bd70588dcf00fc49164f3fde

Author: Stefan Dösinger <stefandoesinger at 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 at gmx.at>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit a2d3b3a5a58cdacb8bf09cb927a3421d9e3cc32a)
Signed-off-by: Michael Stefaniuc <mstefani at 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;




More information about the wine-cvs mailing list