[PATCH 2/3] gdi32: Check DIB size when handling EMR_ALPHABLEND.
Vincent Povirk
vincent at codeweavers.com
Wed May 16 11:29:22 CDT 2018
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
---
dlls/gdi32/enhmetafile.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/dlls/gdi32/enhmetafile.c b/dlls/gdi32/enhmetafile.c
index d8f72c98718..c66e382c1d6 100644
--- a/dlls/gdi32/enhmetafile.c
+++ b/dlls/gdi32/enhmetafile.c
@@ -2559,12 +2559,26 @@ BOOL WINAPI PlayEnhMetaFileRecord(
HBITMAP hBmp = 0, hBmpOld = 0;
const BITMAPINFO *pbi = (const BITMAPINFO *)((const BYTE *)mr + pAlphaBlend->offBmiSrc);
void *bits;
+ DIBSECTION dib;
SetGraphicsMode(hdcSrc, GM_ADVANCED);
SetWorldTransform(hdcSrc, &pAlphaBlend->xformSrc);
hBmp = CreateDIBSection(hdc, pbi, pAlphaBlend->iUsageSrc, &bits, NULL, 0);
- memcpy(bits, (const BYTE *)mr + pAlphaBlend->offBitsSrc, pAlphaBlend->cbBitsSrc);
+ if (!hBmp)
+ {
+ WARN("EMR_ALPHABLEND: couldn't create DIB section\n");
+ return FALSE;
+ }
+
+ if (!GetObjectW(hBmp, sizeof(dib), &dib))
+ {
+ ERR("EMR_ALPHABLEND: couldn't get DIB object\n");
+ DeleteObject(hBmp);
+ return FALSE;
+ }
+
+ memcpy(bits, (const BYTE *)mr + pAlphaBlend->offBitsSrc, min(pAlphaBlend->cbBitsSrc, dib.dsBmih.biSizeImage));
hBmpOld = SelectObject(hdcSrc, hBmp);
GdiAlphaBlend(hdc, pAlphaBlend->xDest, pAlphaBlend->yDest, pAlphaBlend->cxDest, pAlphaBlend->cyDest,
--
2.14.1
More information about the wine-devel
mailing list