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