Nikolay Sivov : wincodecs: Fix parameter validation during scaler initialization.

Alexandre Julliard julliard at winehq.org
Tue Nov 13 15:01:58 CST 2018


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Nov  9 14:26:43 2018 +0300

wincodecs: Fix parameter validation during scaler initialization.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/windowscodecs/scaler.c       |   3 ++
 dlls/windowscodecs/tests/bitmap.c | 101 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 104 insertions(+)

diff --git a/dlls/windowscodecs/scaler.c b/dlls/windowscodecs/scaler.c
index ebcc790..f576ad5 100644
--- a/dlls/windowscodecs/scaler.c
+++ b/dlls/windowscodecs/scaler.c
@@ -309,6 +309,9 @@ static HRESULT WINAPI BitmapScaler_Initialize(IWICBitmapScaler *iface,
 
     TRACE("(%p,%p,%u,%u,%u)\n", iface, pISource, uiWidth, uiHeight, mode);
 
+    if (!pISource || !uiWidth || !uiHeight)
+        return E_INVALIDARG;
+
     EnterCriticalSection(&This->lock);
 
     if (This->source)
diff --git a/dlls/windowscodecs/tests/bitmap.c b/dlls/windowscodecs/tests/bitmap.c
index 5c225d2..34da3b2 100644
--- a/dlls/windowscodecs/tests/bitmap.c
+++ b/dlls/windowscodecs/tests/bitmap.c
@@ -1080,6 +1080,106 @@ static void test_WICCreateBitmapFromSectionEx(void)
     CloseHandle(hsection);
 }
 
+static void test_bitmap_scaler(void)
+{
+    IWICBitmapScaler *scaler;
+    IWICBitmap *bitmap;
+    UINT width, height;
+    HRESULT hr;
+
+    hr = IWICImagingFactory_CreateBitmap(factory, 4, 2, &GUID_WICPixelFormat24bppBGR, WICBitmapCacheOnLoad, &bitmap);
+    ok(hr == S_OK, "Failed to create a bitmap, hr %#x.\n", hr);
+
+    hr = IWICBitmap_GetSize(bitmap, &width, &height);
+    ok(hr == S_OK, "Failed to get bitmap size, hr %#x.\n", hr);
+    ok(width == 4, "Unexpected width %u.\n", width);
+    ok(height == 2, "Unexpected height %u.\n", height);
+
+    hr = IWICImagingFactory_CreateBitmapScaler(factory, &scaler);
+    ok(hr == S_OK, "Failed to create bitmap scaler, hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, NULL, 0, 0,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 0,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, NULL, &height);
+todo_wine
+    ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, &width, NULL);
+todo_wine
+    ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+    width = 123;
+    height = 321;
+    hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+todo_wine
+    ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+    ok(width == 123, "Unexpected width %u.\n", width);
+    ok(height == 321, "Unexpected height %u.\n", height);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 4, 0,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+todo_wine
+    ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 2,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+todo_wine
+    ok(hr == WINCODEC_ERR_NOTINITIALIZED, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Failed to initialize bitmap scaler, hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 4,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == S_OK, "Failed to initialize bitmap scaler, hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 0, 4,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 0,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, NULL, 8, 4, WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_Initialize(scaler, (IWICBitmapSource *)bitmap, 8, 4,
+        WICBitmapInterpolationModeNearestNeighbor);
+    ok(hr == WINCODEC_ERR_WRONGSTATE, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, &width, &height);
+    ok(hr == S_OK, "Failed to get scaler size, hr %#x.\n", hr);
+    ok(width == 8, "Unexpected width %u.\n", width);
+    ok(height == 4, "Unexpected height %u.\n", height);
+
+    hr = IWICBitmapScaler_GetSize(scaler, NULL, &height);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, &width, NULL);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IWICBitmapScaler_GetSize(scaler, NULL, NULL);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    IWICBitmapScaler_Release(scaler);
+
+    IWICBitmap_Release(bitmap);
+}
+
 START_TEST(bitmap)
 {
     HRESULT hr;
@@ -1096,6 +1196,7 @@ START_TEST(bitmap)
     test_CreateBitmapFromHICON();
     test_CreateBitmapFromHBITMAP();
     test_clipper();
+    test_bitmap_scaler();
 
     IWICImagingFactory_Release(factory);
 




More information about the wine-cvs mailing list