[PATCH 4/5] d3drm: Strengthen check for valid viewport dimensions.
Jeff Smith
whydoubt at gmail.com
Thu Sep 12 02:28:27 CDT 2019
Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
dlls/d3drm/tests/d3drm.c | 32 ++++++++++++++++++++++++++++++++
dlls/d3drm/viewport.c | 16 ++++++++++++++--
2 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index d6f8322813..7317a316fa 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -1921,6 +1921,14 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
viewport = (IDirect3DRMViewport *)0xdeadbeef;
+ hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left + 1, rc.top, rc.right, rc.bottom, &viewport);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
+ viewport = (IDirect3DRMViewport *)0xdeadbeef;
+ hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top + 1, rc.right, rc.bottom, &viewport);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
+ viewport = (IDirect3DRMViewport *)0xdeadbeef;
hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom + 1, &viewport);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
@@ -1944,6 +1952,14 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
viewport = (IDirect3DRMViewport *)0xdeadbeef;
+ hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left + 1, rc.top, rc.right, rc.bottom, &viewport);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
+ viewport = (IDirect3DRMViewport *)0xdeadbeef;
+ hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top + 1, rc.right, rc.bottom, &viewport);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
+ viewport = (IDirect3DRMViewport *)0xdeadbeef;
hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom + 1, &viewport);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
ok(!viewport, "Expected viewport returned == NULL, got %p.\n", viewport);
@@ -1967,6 +1983,14 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
ok(!viewport2, "Expected viewport returned == NULL, got %p.\n", viewport2);
viewport2 = (IDirect3DRMViewport2 *)0xdeadbeef;
+ hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left + 1, rc.top, rc.right, rc.bottom, &viewport2);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ ok(!viewport2, "Expected viewport returned == NULL, got %p.\n", viewport2);
+ viewport2 = (IDirect3DRMViewport2 *)0xdeadbeef;
+ hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top + 1, rc.right, rc.bottom, &viewport2);
+ ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
+ ok(!viewport2, "Expected viewport returned == NULL, got %p.\n", viewport2);
+ viewport2 = (IDirect3DRMViewport2 *)0xdeadbeef;
hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top, rc.right + 1, rc.bottom + 1, &viewport2);
ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr);
ok(!viewport2, "Expected viewport returned == NULL, got %p.\n", viewport2);
@@ -2191,6 +2215,10 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left, rc.top, rc.right, rc.bottom + 1);
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
+ hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left + 1, rc.top, rc.right, rc.bottom);
+ ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
+ hr = IDirect3DRMViewport_Init(viewport, device1, frame, rc.left, rc.top + 1, rc.right, rc.bottom);
+ ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
device_ref = get_refcount((IUnknown *)device1);
frame_ref = get_refcount((IUnknown *)frame);
@@ -2409,6 +2437,10 @@ static void test_Viewport(void)
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
hr = IDirect3DRMViewport2_Init(viewport2, device3, frame3, rc.left, rc.top, rc.right, rc.bottom + 1);
ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
+ hr = IDirect3DRMViewport2_Init(viewport2, device3, frame3, rc.left + 1, rc.top, rc.right, rc.bottom);
+ ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
+ hr = IDirect3DRMViewport2_Init(viewport2, device3, frame3, rc.left, rc.top + 1, rc.right, rc.bottom);
+ ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr);
device_ref = get_refcount((IUnknown *)device3);
frame_ref2 = get_refcount((IUnknown *)frame3);
diff --git a/dlls/d3drm/viewport.c b/dlls/d3drm/viewport.c
index 25a83e6e89..24fa198de5 100644
--- a/dlls/d3drm/viewport.c
+++ b/dlls/d3drm/viewport.c
@@ -300,6 +300,19 @@ static HRESULT WINAPI d3drm_viewport1_GetClassName(IDirect3DRMViewport *iface, D
return d3drm_viewport2_GetClassName(&viewport->IDirect3DRMViewport2_iface, size, name);
}
+static HRESULT d3drm_viewport_check_device_dims(struct d3drm_device *device,
+ DWORD x, DWORD y, DWORD width, DWORD height)
+{
+ if (x > device->width || y > device->height
+ || width > device->width || height > device->height
+ || x + width > device->width || y + height > device->height)
+ {
+ return D3DRMERR_BADVALUE;
+ }
+
+ return D3D_OK;
+}
+
static HRESULT WINAPI d3drm_viewport2_Init(IDirect3DRMViewport2 *iface, IDirect3DRMDevice3 *device,
IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height)
{
@@ -317,8 +330,7 @@ static HRESULT WINAPI d3drm_viewport2_Init(IDirect3DRMViewport2 *iface, IDirect3
iface, device, camera, x, y, width, height);
if (!device_obj || !camera
- || width > device_obj->width
- || height > device_obj->height)
+ || FAILED(d3drm_viewport_check_device_dims(device_obj, x, y, width, height)))
{
return D3DRMERR_BADOBJECT;
}
--
2.21.0
More information about the wine-devel
mailing list