You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/01/12 21:37:02 UTC

svn commit: r1724314 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java

Author: tilman
Date: Tue Jan 12 20:37:02 2016
New Revision: 1724314

URL: http://svn.apache.org/viewvc?rev=1724314&view=rev
Log:
PDFBOX-3189: don't read overlong numbers to avoid pushback exception
PDFBOX-2852: add comment; improve log msg

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java?rev=1724314&r1=1724313&r2=1724314&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java Tue Jan 12 20:37:02 2016
@@ -50,6 +50,8 @@ public abstract class BaseParser
 
     private static final long GENERATION_NUMBER_THRESHOLD = 65535;
 
+    static final int MAX_LENGTH_LONG = Long.toString(Long.MAX_VALUE).length();
+
     /**
      * Log instance.
      */
@@ -207,7 +209,7 @@ public abstract class BaseParser
             else
             {
                 // invalid dictionary, we were expecting a /Name, read until the end or until we can recover
-                LOG.warn("Invalid dictionary, found: '" + c + "' but expected: '/'");
+                LOG.warn("Invalid dictionary, found: '" + c + "' but expected: '/' at offset " + seqSource.getPosition());
                 if (readUntilEndOfCOSDictionary())
                 {
                     // we couldn't recover
@@ -292,6 +294,7 @@ public abstract class BaseParser
         }
         else
         {
+            // label this item as direct, to avoid signature problems.
             value.setDirect(true);
             obj.setItem(key, value);
         }
@@ -1364,6 +1367,11 @@ public abstract class BaseParser
                 lastByte != -1 )
         {
             buffer.append( (char)lastByte );
+            if (buffer.length() > MAX_LENGTH_LONG)
+            {
+                throw new IOException("Number '" + buffer + 
+                        "' is getting too long, stop reading at offset " + seqSource.getPosition());
+            }
         }
         if( lastByte != -1 )
         {