[Splash] Fix crash in PDF with nested softmasks
Bug #91240
diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc
index 801d7e1..97ed1c1 100644
--- a/poppler/SplashOutputDev.cc
+++ b/poppler/SplashOutputDev.cc
@@ -1229,6 +1229,7 @@
struct SplashTransparencyGroup {
int tx, ty; // translation coordinates
SplashBitmap *tBitmap; // bitmap for transparency group
+ SplashBitmap *softmask; // bitmap for softmasks
GfxColorSpace *blendingColorSpace;
GBool isolated;
@@ -2780,8 +2781,8 @@
imgMaskData.height = height;
imgMaskData.y = 0;
- maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse);
- maskSplash = new Splash(maskBitmap, vectorAntialias);
+ transpGroupStack->softmask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse);
+ maskSplash = new Splash(transpGroupStack->softmask, vectorAntialias);
maskColor[0] = 0;
maskSplash->clear(maskColor);
maskColor[0] = 0xff;
@@ -2798,13 +2799,15 @@
/* transfer mask to alpha channel! */
// memcpy(maskBitmap->getAlphaPtr(), maskBitmap->getDataPtr(), bitmap->getRowSize() * bitmap->getHeight());
// memset(maskBitmap->getDataPtr(), 0, bitmap->getRowSize() * bitmap->getHeight());
- Guchar *dest = bitmap->getAlphaPtr();
- Guchar *src = maskBitmap->getDataPtr();
- for (int c= 0; c < maskBitmap->getRowSize() * maskBitmap->getHeight(); c++) {
- dest[c] = src[c];
+ if (transpGroupStack->softmask != NULL) {
+ Guchar *dest = bitmap->getAlphaPtr();
+ Guchar *src = transpGroupStack->softmask->getDataPtr();
+ for (int c= 0; c < transpGroupStack->softmask->getRowSize() * transpGroupStack->softmask->getHeight(); c++) {
+ dest[c] = src[c];
+ }
+ delete transpGroupStack->softmask;
+ transpGroupStack->softmask = NULL;
}
- delete maskBitmap;
- maskBitmap = NULL;
endTransparencyGroup(state);
baseMatrix[4] += transpGroupStack->tx;
baseMatrix[5] += transpGroupStack->ty;
@@ -3986,6 +3989,7 @@
// push a new stack entry
transpGroup = new SplashTransparencyGroup();
+ transpGroup->softmask = NULL;
transpGroup->tx = tx;
transpGroup->ty = ty;
transpGroup->blendingColorSpace = blendingColorSpace;