=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: ddraw: Validate "dwSize" when setting viewports.

Alexandre Julliard julliard at winehq.org
Mon Nov 12 16:26:56 CST 2018


Module: wine
Branch: master
Commit: 709f596b6b3c3deb52c2869a50c83cb23740f56f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=709f596b6b3c3deb52c2869a50c83cb23740f56f

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Nov 12 15:13:03 2018 +0100

ddraw: Validate "dwSize" when setting viewports.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ddraw/viewport.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index fad079f..6f8f33b 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -309,6 +309,12 @@ static HRESULT WINAPI d3d_viewport_SetViewport(IDirect3DViewport3 *iface, D3DVIE
     if (!vp)
         return DDERR_INVALIDPARAMS;
 
+    if (vp->dwSize != sizeof(*vp))
+    {
+        WARN("Invalid D3DVIEWPORT size %u.\n", vp->dwSize);
+        return DDERR_INVALIDPARAMS;
+    }
+
     if (TRACE_ON(ddraw))
     {
         TRACE("  getting D3DVIEWPORT :\n");
@@ -343,13 +349,12 @@ static HRESULT WINAPI d3d_viewport_SetViewport(IDirect3DViewport3 *iface, D3DVIE
     }
 
     viewport->use_vp2 = 0;
-    memset(&viewport->viewports.vp1, 0, sizeof(viewport->viewports.vp1));
-    memcpy(&viewport->viewports.vp1, vp, vp->dwSize);
+    viewport->viewports.vp1 = *vp;
 
     /* Empirical testing on a couple of d3d1 games showed that these values
      * should be ignored. */
-    viewport->viewports.vp1.dvMinZ = 0.0;
-    viewport->viewports.vp1.dvMaxZ = 1.0;
+    viewport->viewports.vp1.dvMinZ = 0.0f;
+    viewport->viewports.vp1.dvMaxZ = 1.0f;
 
     if (SUCCEEDED(IDirect3DDevice3_GetCurrentViewport(&device->IDirect3DDevice3_iface, &current_viewport)))
     {
@@ -950,6 +955,12 @@ static HRESULT WINAPI d3d_viewport_SetViewport2(IDirect3DViewport3 *iface, D3DVI
     if (!vp)
         return DDERR_INVALIDPARAMS;
 
+    if (vp->dwSize != sizeof(*vp))
+    {
+        WARN("Invalid D3DVIEWPORT2 size %u.\n", vp->dwSize);
+        return DDERR_INVALIDPARAMS;
+    }
+
     if (TRACE_ON(ddraw))
     {
         TRACE("  getting D3DVIEWPORT2 :\n");
@@ -984,8 +995,7 @@ static HRESULT WINAPI d3d_viewport_SetViewport2(IDirect3DViewport3 *iface, D3DVI
     }
 
     viewport->use_vp2 = 1;
-    memset(&viewport->viewports.vp2, 0, sizeof(viewport->viewports.vp2));
-    memcpy(&viewport->viewports.vp2, vp, vp->dwSize);
+    viewport->viewports.vp2 = *vp;
 
     if (SUCCEEDED(IDirect3DDevice3_GetCurrentViewport(&device->IDirect3DDevice3_iface, &current_viewport)))
     {




More information about the wine-cvs mailing list