From: Esme Povirk <esme@codeweavers.com> --- dlls/gdiplus/image.c | 3 +++ dlls/gdiplus/tests/image.c | 42 +++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index d8a63a1d39a..6e99cd30db6 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1477,6 +1477,9 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* info, if (!info || !bits || !bitmap) return InvalidParameter; + if (info->bmiHeader.biSize < sizeof(BITMAPINFOHEADER)) + return InvalidParameter; + hbm = CreateDIBSection(0, info, DIB_RGB_COLORS, &bmbits, NULL, 0); if (!hbm) return InvalidParameter; diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 92fa251aced..39b48d65637 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -309,8 +309,9 @@ static void test_FromGdiDib(void) GpBitmap *bm; GpStatus stat; BYTE buff[400]; - BYTE rbmi[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)]; + BYTE rbmi[sizeof(BITMAPV5HEADER)+256*sizeof(RGBQUAD)]; BITMAPINFO *bmi = (BITMAPINFO*)rbmi; + BITMAPCOREINFO *bmci = (BITMAPCOREINFO*)rbmi; bm = NULL; @@ -409,9 +410,48 @@ static void test_FromGdiDib(void) GdipDisposeImage((GpImage*)bm); } + bmi->bmiHeader.biSize = sizeof(BITMAPV5HEADER); + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + check_bitmap_bits(bm, 10, 10, -4, PixelFormat1bppIndexed, &buff[4*9], TRUE); + + GdipDisposeImage((GpImage*)bm); + } + + bmi->bmiHeader.biSize = sizeof(BITMAPV4HEADER); + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); + if (stat == Ok) + { + check_bitmap_bits(bm, 10, 10, -4, PixelFormat1bppIndexed, &buff[4*9], TRUE); + + GdipDisposeImage((GpImage*)bm); + } + +#if 0 + bmi->bmiHeader.biSize = sizeof(BITMAPV4HEADER)+4; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(InvalidParameter, stat); // Native sometimes fails and sometimes succeeds + if (stat == Ok) + GdipDisposeImage((GpImage*)bm); +#endif + + bmi->bmiHeader.biSize = sizeof(BITMAPV4HEADER); bmi->bmiHeader.biBitCount = 0; stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); expect(InvalidParameter, stat); + + bmci->bmciHeader.bcSize = sizeof(BITMAPCOREHEADER); + bmci->bmciHeader.bcWidth = 10; + bmci->bmciHeader.bcHeight = 10; + bmci->bmciHeader.bcPlanes = 1; + bmci->bmciHeader.bcBitCount = 1; + stat = GdipCreateBitmapFromGdiDib(bmi, buff, &bm); + expect(InvalidParameter, stat); } static void test_GetImageDimension(void) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10652