summaryrefslogtreecommitdiff
path: root/poppler
diff options
context:
space:
mode:
authorAlbert Astals Cid <aacid@kde.org>2006-04-05 18:20:56 +0000
committerAlbert Astals Cid <aacid@kde.org>2006-04-05 18:20:56 +0000
commitbf7afe161d76c50fd1c480eb236607145782e59d (patch)
tree72ae8d9655c7e645e0d45046345a4ff127fa3346 /poppler
parent315f8e488d3db848f88a06c7568b6583bbf0e432 (diff)
poppler/JBIG2Stream.cc: Fix for some buggy JBIG2 documents, patch by Raj Kumar and Paul Walmsley. Fixes bug 6500
Diffstat (limited to 'poppler')
-rw-r--r--poppler/JBIG2Stream.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc
index 05b1ab22..6e58d038 100644
--- a/poppler/JBIG2Stream.cc
+++ b/poppler/JBIG2Stream.cc
@@ -1229,6 +1229,7 @@ void JBIG2Stream::readSegments() {
Guint segNum, segFlags, segType, page, segLength;
Guint refFlags, nRefSegs;
Guint *refSegs;
+ int segDataPos;
int c1, c2, c3;
Guint i;
@@ -1296,6 +1297,9 @@ void JBIG2Stream::readSegments() {
goto eofError2;
}
+ // keep track of the start of the segment data
+ segDataPos = getPos();
+
// read the segment data
switch (segType) {
case 0:
@@ -1373,6 +1377,45 @@ void JBIG2Stream::readSegments() {
break;
}
+ // Make sure the segment handler read all of the bytes in the
+ // segment data, unless this segment is marked as having an
+ // unknown length (section 7.2.7 of the JBIG2 Final Committee Draft)
+
+ if (segLength != 0xffffffff) {
+
+ int segExtraBytes = segDataPos + segLength - getPos();
+ if (segExtraBytes > 0) {
+
+ // If we didn't read all of the bytes in the segment data,
+ // indicate an error, and throw away the rest of the data.
+
+ // v.3.1.01.13 of the LuraTech PDF Compressor Server will
+ // sometimes generate an extraneous NULL byte at the end of
+ // arithmetic-coded symbol dictionary segments when numNewSyms
+ // == 0. Segments like this often occur for blank pages.
+
+ error(getPos(), "%d extraneous byte%s after segment",
+ segExtraBytes, (segExtraBytes > 1) ? "s" : "");
+
+ // Burn through the remaining bytes -- inefficient, but
+ // hopefully we're not doing this much
+
+ int trash;
+ for (int i = segExtraBytes; i > 0; i--) {
+ readByte(&trash);
+ }
+
+ } else if (segExtraBytes < 0) {
+
+ // If we read more bytes than we should have, according to the
+ // segment length field, note an error.
+
+ error(getPos(), "Previous segment handler read too many bytes");
+
+ }
+
+ }
+
gfree(refSegs);
}