Author: lehmi
Date: Mon May 30 17:00:06 2011
New Revision: 1129256

URL: http://svn.apache.org/viewvc?rev=1129256&view=rev
Log:
PDFBOX-771: ensure that the rows value of a CCITTFax encoded xobject doesn't 
contain implausible data

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java?rev=1129256&r1=1129255&r2=1129256&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java
 Mon May 30 17:00:06 2011
@@ -71,9 +71,11 @@ public class CCITTFaxDecodeFilter implem
         compressedData.read(compressed, 0, length);
         int cols = decodeParms.getInt(COSName.COLUMNS, 1728);
         int rows = decodeParms.getInt(COSName.ROWS, 0);
-        if (rows == 0)
+        int height = options.getInt(COSName.HEIGHT, 0); 
+        if (rows > 0 && height > 0)
         {
-            rows = options.getInt(COSName.HEIGHT);
+            // ensure that rows doesn't contain implausible data, see 
PDFBOX-771
+            rows = Math.min(rows, height);
         }
         int k = decodeParms.getInt(COSName.K);
         int arraySize = (cols + 7) / 8 * rows;

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java?rev=1129256&r1=1129255&r2=1129256&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
 Mon May 30 17:00:06 2011
@@ -34,6 +34,7 @@ import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.io.RandomAccess;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.common.PDStream;
@@ -107,8 +108,8 @@ public class PDCcitt extends PDXObjectIm
     public BufferedImage getRGBImage() throws IOException
     {
         BufferedImage retval = null;
-        InputStream stream = getCOSStream().getUnfilteredStream();
-        COSBase decodeP = 
getPDStream().getStream().getDictionaryObject(COSName.DECODE_PARMS);
+        COSStream stream = getCOSStream();
+        COSBase decodeP = stream.getDictionaryObject(COSName.DECODE_PARMS);
         COSDictionary decodeParms = null;
         if (decodeP instanceof COSDictionary)
             decodeParms = (COSDictionary)decodeP;
@@ -116,9 +117,11 @@ public class PDCcitt extends PDXObjectIm
             decodeParms =  (COSDictionary)((COSArray)decodeP).get(0);
         int cols = decodeParms.getInt(COSName.COLUMNS, 1728);
         int rows = decodeParms.getInt(COSName.ROWS, 0);
-        if (rows == 0)
+        int height = stream.getInt(COSName.HEIGHT);
+        if (rows > 0 && height > 0)
         {
-            rows = getPDStream().getStream().getInt(COSName.HEIGHT);
+            // ensure that rows doesn't contain implausible data, see 
PDFBOX-771
+            rows = Math.min(rows, height);
         }
         boolean blackIsOne = decodeParms.getBoolean(COSName.BLACK_IS_1, false);
         
@@ -135,7 +138,8 @@ public class PDCcitt extends PDXObjectIm
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         int bytesRead;
         byte[] data = new byte[16384];
-        while ((bytesRead = stream.read(data, 0, data.length)) != -1) {
+        InputStream unfilteredStream = stream.getUnfilteredStream();
+        while ((bytesRead = unfilteredStream.read(data, 0, data.length)) != 
-1) {
             baos.write(data, 0, bytesRead);
         }
         baos.flush();


Reply via email to