poppler/XRef.cc | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-)
New commits: commit cc7809e73c71e0e6b7db29dc8a12cfb573448b77 Author: Albert Astals Cid <aa...@kde.org> Date: Wed Apr 5 23:18:52 2017 +0200 Make XRef reconstruction a bit better Also detect streams whose endstream is on the middle of a line and not only at the beginning Bug #100509 diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 2add7dc0..8d8fac42 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -1023,17 +1023,25 @@ GBool XRef::constructXRef(GBool *wasReconstructed, GBool needCatalogDict) { } } - } else if (!strncmp(p, "endstream", 9)) { - if (streamEndsLen == streamEndsSize) { - streamEndsSize += 64; - if (streamEndsSize >= INT_MAX / (int)sizeof(int)) { - error(errSyntaxError, -1, "Invalid 'endstream' parameter."); - return gFalse; - } - streamEnds = (Goffset *)greallocn(streamEnds, - streamEndsSize, sizeof(Goffset)); - } - streamEnds[streamEndsLen++] = pos; + } else { + char *endstream = strstr( p, "endstream" ); + if (endstream) { + int endstreamPos = endstream - p; + if ((endstreamPos == 0 || Lexer::isSpace(p[endstreamPos-1] & 0xff)) // endstream is either at beginning or preceeded by space + && (endstreamPos + 9 >= 256 || Lexer::isSpace(p[endstreamPos+9] & 0xff))) // endstream is either at end or followed by space + { + if (streamEndsLen == streamEndsSize) { + streamEndsSize += 64; + if (streamEndsSize >= INT_MAX / (int)sizeof(int)) { + error(errSyntaxError, -1, "Invalid 'endstream' parameter."); + return gFalse; + } + streamEnds = (Goffset *)greallocn(streamEnds, + streamEndsSize, sizeof(Goffset)); + } + streamEnds[streamEndsLen++] = pos + endstreamPos; + } + } } if( token ) { p = token + 6;// strlen( "endobj" ) = 6 _______________________________________________ poppler mailing list poppler@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/poppler