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

Reply via email to