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);
}