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 2018/10/21 06:16:18 UTC

svn commit: r1844459 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java

Author: tilman
Date: Sun Oct 21 06:16:18 2018
New Revision: 1844459

URL: http://svn.apache.org/viewvc?rev=1844459&view=rev
Log:
PDFBOX-4353: avoid ClassCastException and NoSuchElementException

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

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java?rev=1844459&r1=1844458&r2=1844459&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java Sun Oct 21 06:16:18 2018
@@ -72,12 +72,15 @@ public class PDFXrefStreamParser extends
         }
         COSArray xrefFormat = (COSArray) w;
         
-        COSArray indexArray = (COSArray)stream.getDictionaryObject(COSName.INDEX);
-        /*
-         * If Index doesn't exist, we will use the default values.
-         */
-        if(indexArray == null)
+        COSBase base = stream.getDictionaryObject(COSName.INDEX);
+        COSArray indexArray;
+        if (base instanceof COSArray)
         {
+            indexArray = (COSArray) base;
+        }
+        else
+        {
+            // If /Index doesn't exist, we will use the default values.
             indexArray = new COSArray();
             indexArray.add(COSInteger.ZERO);
             indexArray.add(COSInteger.get(stream.getInt(COSName.SIZE, 0)));
@@ -89,11 +92,25 @@ public class PDFXrefStreamParser extends
          * Populates objNums with all object numbers available
          */
         Iterator<COSBase> indexIter = indexArray.iterator();
-        while(indexIter.hasNext())
+        while (indexIter.hasNext())
         {
-            long objID = ((COSInteger)indexIter.next()).longValue();
-            int size = ((COSInteger)indexIter.next()).intValue();
-            for(int i = 0; i < size; i++)
+            base = indexIter.next();
+            if (!(base instanceof COSInteger))
+            {
+                throw new IOException("Xref stream must have integer in /Index array");
+            }
+            long objID = ((COSInteger) base).longValue();
+            if (!indexIter.hasNext())
+            {
+                break;
+            }
+            base = indexIter.next();
+            if (!(base instanceof COSInteger))
+            {
+                throw new IOException("Xref stream must have integer in /Index array");
+            }
+            int size = ((COSInteger) base).intValue();
+            for (int i = 0; i < size; i++)
             {
                 objNums.add(objID + i);
             }