Nikolay Sivov : d2d1: Explicitly validate bitmap options for CreateBitmap().

Alexandre Julliard julliard at winehq.org
Mon May 30 15:34:57 CDT 2022


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun May 29 13:42:38 2022 +0300

d2d1: Explicitly validate bitmap options for CreateBitmap().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>

---

 dlls/d2d1/bitmap.c     | 20 ++++++++++++++++++++
 dlls/d2d1/tests/d2d1.c | 33 ++++++++++++++++++++++++++++++---
 2 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index 8386f703b46..904d44cc075 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -336,6 +336,23 @@ static void d2d_bitmap_init(struct d2d_bitmap *bitmap, struct d2d_device_context
     }
 }
 
+static BOOL check_bitmap_options(unsigned int options)
+{
+    switch (options)
+    {
+        case D2D1_BITMAP_OPTIONS_NONE:
+        case D2D1_BITMAP_OPTIONS_TARGET:
+        case D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW:
+        case D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE:
+        case D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE:
+        case D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ:
+            return TRUE;
+        default:
+            WARN("Invalid bitmap options %#x.\n", options);
+            return FALSE;
+    }
+}
+
 HRESULT d2d_bitmap_create(struct d2d_device_context *context, D2D1_SIZE_U size, const void *src_data,
         UINT32 pitch, const D2D1_BITMAP_PROPERTIES1 *desc, struct d2d_bitmap **bitmap)
 {
@@ -364,6 +381,9 @@ HRESULT d2d_bitmap_create(struct d2d_device_context *context, D2D1_SIZE_U size,
         return E_INVALIDARG;
     }
 
+    if (!check_bitmap_options(desc->bitmapOptions))
+        return E_INVALIDARG;
+
     texture_desc.Width = size.width;
     texture_desc.Height = size.height;
     if (!texture_desc.Width || !texture_desc.Height)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 0069cf746bb..6f22436c892 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -11798,6 +11798,18 @@ static void test_bitmap_create(BOOL d3d11)
         { D2D1_BITMAP_OPTIONS_CPU_READ },
         { D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE },
     };
+    static const struct
+    {
+        unsigned int options;
+    } valid_options[] =
+    {
+        { D2D1_BITMAP_OPTIONS_NONE },
+        { D2D1_BITMAP_OPTIONS_TARGET },
+        { D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW },
+        { D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE },
+        { D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE },
+        { D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ },
+    };
     D2D1_BITMAP_PROPERTIES1 bitmap_desc;
     struct d2d1_test_context ctx;
     ID2D1Bitmap1 *bitmap;
@@ -11820,10 +11832,25 @@ static void test_bitmap_create(BOOL d3d11)
         bitmap_desc.bitmapOptions = invalid_options[i].options;
         bitmap_desc.colorContext = NULL;
         hr = ID2D1DeviceContext_CreateBitmap(ctx.context, size, NULL, 0, &bitmap_desc, &bitmap);
-        todo_wine_if(i != 1)
         ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr);
-        if (SUCCEEDED(hr))
-            ID2D1Bitmap1_Release(bitmap);
+
+        winetest_pop_context();
+    }
+
+    for (i = 0; i < ARRAY_SIZE(valid_options); ++i)
+    {
+        winetest_push_context("Test %u", i);
+
+        set_size_u(&size, 4, 4);
+        bitmap_desc.dpiX = 96.0f;
+        bitmap_desc.dpiY = 96.0f;
+        bitmap_desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
+        bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;
+        bitmap_desc.bitmapOptions = valid_options[i].options;
+        bitmap_desc.colorContext = NULL;
+        hr = ID2D1DeviceContext_CreateBitmap(ctx.context, size, NULL, 0, &bitmap_desc, &bitmap);
+        ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+        ID2D1Bitmap1_Release(bitmap);
 
         winetest_pop_context();
     }




More information about the wine-cvs mailing list