Thu Nov 19 17:58:41 2009 UTC ()
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.


(drochner)
diff -r1.43 -r1.44 pkgsrc/print/poppler/Makefile
diff -r1.48 -r1.49 pkgsrc/print/poppler/distinfo
diff -r0 -r1.1 pkgsrc/print/poppler/patches/patch-ap

cvs diff -r1.43 -r1.44 pkgsrc/print/poppler/Makefile (expand / switch to unified diff)

--- pkgsrc/print/poppler/Makefile 2009/09/09 19:57:05 1.43
+++ pkgsrc/print/poppler/Makefile 2009/11/19 17:58:41 1.44
@@ -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
 6PKGREVISION= 1
 7
6COMMENT= PDF rendering library 8COMMENT= PDF rendering library
7MAINTAINER= reed@reedmedia.net 9MAINTAINER= reed@reedmedia.net
8 10
9USE_TOOLS+= gmake 11USE_TOOLS+= gmake
10 12
11#PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-cairo.pc.in 13#PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-cairo.pc.in
12PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-splash.pc.in 14PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler-splash.pc.in
13PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler.pc.in 15PKGCONFIG_OVERRIDE+= ${WRKSRC}/poppler.pc.in
14GNU_CONFIGURE= yes 16GNU_CONFIGURE= yes
15 17
16INSTALLATION_DIRS+= include/poppler share/doc/poppler 18INSTALLATION_DIRS+= include/poppler share/doc/poppler
17 19
18CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR:Q} 20CONFIGURE_ARGS+= --sysconfdir=${PKG_SYSCONFDIR:Q}

cvs diff -r1.48 -r1.49 pkgsrc/print/poppler/distinfo (expand / switch to unified diff)

--- pkgsrc/print/poppler/distinfo 2009/10/21 10:18:57 1.48
+++ pkgsrc/print/poppler/distinfo 2009/11/19 17:58:41 1.49
@@ -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
3SHA1 (poppler-0.12.1.tar.gz) = 0c8514f789eaab4e91ba1a841f58f8bee95e4a43 3SHA1 (poppler-0.12.1.tar.gz) = 0c8514f789eaab4e91ba1a841f58f8bee95e4a43
4RMD160 (poppler-0.12.1.tar.gz) = 92ea043b8b329e23d13068af5cfed8fd47eea5e8 4RMD160 (poppler-0.12.1.tar.gz) = 92ea043b8b329e23d13068af5cfed8fd47eea5e8
5Size (poppler-0.12.1.tar.gz) = 1641986 bytes 5Size (poppler-0.12.1.tar.gz) = 1641986 bytes
6SHA1 (patch-aa) = 43c63c16d3a845e394a8eb0c3a321944fcf17615 6SHA1 (patch-aa) = 43c63c16d3a845e394a8eb0c3a321944fcf17615
7SHA1 (patch-ab) = 441308aec73c66a34c00ee1fad30a38748c89a7d 7SHA1 (patch-ab) = 441308aec73c66a34c00ee1fad30a38748c89a7d
8SHA1 (patch-ag) = 58d01b019daec19de80867ce0941e5160591bf62 8SHA1 (patch-ag) = 58d01b019daec19de80867ce0941e5160591bf62
9SHA1 (patch-ai) = a51dba3fb0e7131873ef82ae5e256fb1d17cee53 9SHA1 (patch-ai) = a51dba3fb0e7131873ef82ae5e256fb1d17cee53
10SHA1 (patch-ao) = cf7e0f086522147a91f59b1b26ca510d1971ac74 10SHA1 (patch-ao) = cf7e0f086522147a91f59b1b26ca510d1971ac74
 11SHA1 (patch-ap) = f39b70d9420201281a6735114029514ef636f1bb
11SHA1 (patch-ba) = 9b98dcfae8d997f9250e161faf8cce7f168798b5 12SHA1 (patch-ba) = 9b98dcfae8d997f9250e161faf8cce7f168798b5
12SHA1 (patch-bb) = 23fe8bab6eaadc0c9701c0125f07afbf6bffcbaa 13SHA1 (patch-bb) = 23fe8bab6eaadc0c9701c0125f07afbf6bffcbaa

File Added: pkgsrc/print/poppler/patches/Attic/patch-ap
$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) {