The code which calculates linear gradients divides by zero under some circumstances. This leads to NaNs passed to cairo which makes that literally "nan" is inserted into the output file when printing. The resulting file crashes ghostscript, and also poppler when it is fed to it again. I didn't read PDF specs yet to understand where the math is failing, just avoided the division by zero.diff -r1.43 -r1.44 pkgsrc/print/poppler/Makefile
(drochner)
@@ -1,18 +1,20 @@ | @@ -1,18 +1,20 @@ | |||
1 | # $NetBSD: Makefile,v 1.43 2009/09/09 19:57:05 drochner Exp $ | 1 | # $NetBSD: Makefile,v 1.44 2009/11/19 17:58:41 drochner Exp $ | |
2 | # | 2 | # | |
3 | 3 | |||
4 | .include "../../print/poppler/Makefile.common" | 4 | .include "../../print/poppler/Makefile.common" | |
5 | 5 | |||
6 | PKGREVISION= 1 | |||
7 | ||||
6 | COMMENT= PDF rendering library | 8 | COMMENT= PDF rendering library | |
7 | MAINTAINER= reed@reedmedia.net | 9 | MAINTAINER= reed@reedmedia.net | |
8 | 10 | |||
9 | USE_TOOLS+= gmake | 11 | USE_TOOLS+= gmake | |
10 | 12 | |||
11 | #PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-cairo.pc.in | 13 | #PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-cairo.pc.in | |
12 | PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-splash.pc.in | 14 | PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-splash.pc.in | |
13 | PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler.pc.in | 15 | PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler.pc.in | |
14 | GNU_CONFIGURE= yes | 16 | GNU_CONFIGURE= yes | |
15 | 17 | |||
16 | INSTALLATION_DIRS+= include/poppler share/doc/poppler | 18 | INSTALLATION_DIRS+= include/poppler share/doc/poppler | |
17 | 19 | |||
18 | CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR:Q} | 20 | CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR:Q} |
@@ -1,12 +1,13 @@ | @@ -1,12 +1,13 @@ | |||
1 | $NetBSD: distinfo,v 1.48 2009/10/21 10:18:57 drochner Exp $ | 1 | $NetBSD: distinfo,v 1.49 2009/11/19 17:58:41 drochner Exp $ | |
2 | 2 | |||
3 | SHA1 (poppler-0.12.1.tar.gz) = 0c8514f789eaab4e91ba1a841f58f8bee95e4a43 | 3 | SHA1 (poppler-0.12.1.tar.gz) = 0c8514f789eaab4e91ba1a841f58f8bee95e4a43 | |
4 | RMD160 (poppler-0.12.1.tar.gz) = 92ea043b8b329e23d13068af5cfed8fd47eea5e8 | 4 | RMD160 (poppler-0.12.1.tar.gz) = 92ea043b8b329e23d13068af5cfed8fd47eea5e8 | |
5 | Size (poppler-0.12.1.tar.gz) = 1641986 bytes | 5 | Size (poppler-0.12.1.tar.gz) = 1641986 bytes | |
6 | SHA1 (patch-aa) = 43c63c16d3a845e394a8eb0c3a321944fcf17615 | 6 | SHA1 (patch-aa) = 43c63c16d3a845e394a8eb0c3a321944fcf17615 | |
7 | SHA1 (patch-ab) = 441308aec73c66a34c00ee1fad30a38748c89a7d | 7 | SHA1 (patch-ab) = 441308aec73c66a34c00ee1fad30a38748c89a7d | |
8 | SHA1 (patch-ag) = 58d01b019daec19de80867ce0941e5160591bf62 | 8 | SHA1 (patch-ag) = 58d01b019daec19de80867ce0941e5160591bf62 | |
9 | SHA1 (patch-ai) = a51dba3fb0e7131873ef82ae5e256fb1d17cee53 | 9 | SHA1 (patch-ai) = a51dba3fb0e7131873ef82ae5e256fb1d17cee53 | |
10 | SHA1 (patch-ao) = cf7e0f086522147a91f59b1b26ca510d1971ac74 | 10 | SHA1 (patch-ao) = cf7e0f086522147a91f59b1b26ca510d1971ac74 | |
11 | SHA1 (patch-ap) = f39b70d9420201281a6735114029514ef636f1bb | |||
11 | SHA1 (patch-ba) = 9b98dcfae8d997f9250e161faf8cce7f168798b5 | 12 | SHA1 (patch-ba) = 9b98dcfae8d997f9250e161faf8cce7f168798b5 | |
12 | SHA1 (patch-bb) = 23fe8bab6eaadc0c9701c0125f07afbf6bffcbaa | 13 | SHA1 (patch-bb) = 23fe8bab6eaadc0c9701c0125f07afbf6bffcbaa |
$NetBSD: patch-ap,v 1.1 2009/11/19 17:58:41 drochner Exp $
--- poppler/Gfx.cc.orig 2009-09-09 23:25:11.000000000 +0200
+++ poppler/Gfx.cc
@@ -2462,7 +2462,10 @@ void Gfx::doAxialShFill(GfxAxialShading
if (out->useFillColorStop()) {
// make sure we add stop color when t = tMin
state->setFillColor(&color0);
- out->updateFillColorStop(state, (tt - tMin)/(tMax - tMin));
+ if (tMax == tMin)
+ out->updateFillColorStop(state, tMin);
+ else
+ out->updateFillColorStop(state, (tt - tMin)/(tMax - tMin));
}
// compute the coordinates of the point on the t axis at t = tMin;
@@ -2602,9 +2605,12 @@ void Gfx::doAxialShFill(GfxAxialShading
// set the color
state->setFillColor(&color0);
- if (out->useFillColorStop())
- out->updateFillColorStop(state, (ta[j] - tMin)/(tMax - tMin));
- else
+ if (out->useFillColorStop()) {
+ if (tMax == tMin)
+ out->updateFillColorStop(state, tMin);
+ else
+ out->updateFillColorStop(state, (ta[j] - tMin)/(tMax - tMin));
+ } else
out->updateFillColor(state);
if (needExtend) {