You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2009/06/20 13:17:30 UTC
svn commit: r786793 - in /poi/trunk/src: documentation/content/xdocs/
java/org/apache/poi/ddf/ testcases/org/apache/poi/ddf/
testcases/org/apache/poi/ddf/data/
Author: yegor
Date: Sat Jun 20 11:17:30 2009
New Revision: 786793
URL: http://svn.apache.org/viewvc?rev=786793&view=rev
Log:
Fixed OOM in HSSFWorkbook#getAllPictures when reading .xls files containing metafiles, see Bugzilla 47143
Added:
poi/trunk/src/testcases/org/apache/poi/ddf/data/47143.dat (with props)
Modified:
poi/trunk/src/documentation/content/xdocs/status.xml
poi/trunk/src/java/org/apache/poi/ddf/EscherBSERecord.java
poi/trunk/src/java/org/apache/poi/ddf/EscherDggRecord.java
poi/trunk/src/java/org/apache/poi/ddf/EscherMetafileBlip.java
poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherBlipRecord.java
Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=786793&r1=786792&r2=786793&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Sat Jun 20 11:17:30 2009
@@ -33,6 +33,7 @@
<changes>
<release version="3.5-beta7" date="2009-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">47143 - Fixed OOM in HSSFWorkbook#getAllPictures when reading .xls files containing metafiles</action>
<action dev="POI-DEVELOPERS" type="add">Added implementation for ISNA()</action>
<action dev="POI-DEVELOPERS" type="add">46793 - fixed SimpleShape#getLineWidth to handle default line width </action>
<action dev="POI-DEVELOPERS" type="add">47356 - removed unused private fields in HWPF BorderCode</action>
Modified: poi/trunk/src/java/org/apache/poi/ddf/EscherBSERecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ddf/EscherBSERecord.java?rev=786793&r1=786792&r2=786793&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ddf/EscherBSERecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/ddf/EscherBSERecord.java Sat Jun 20 11:17:30 2009
@@ -310,13 +310,13 @@
}
public String toString() {
- String extraData = HexDump.toHex(_remainingData, 32);
+ String extraData = _remainingData == null ? null : HexDump.toHex(_remainingData, 32);
return getClass().getName() + ":" + '\n' +
" RecordId: 0x" + HexDump.toHex( RECORD_ID ) + '\n' +
" Options: 0x" + HexDump.toHex( getOptions() ) + '\n' +
" BlipTypeWin32: " + field_1_blipTypeWin32 + '\n' +
" BlipTypeMacOS: " + field_2_blipTypeMacOS + '\n' +
- " SUID: " + HexDump.toHex(field_3_uid) + '\n' +
+ " SUID: " + (field_3_uid == null ? "" : HexDump.toHex(field_3_uid)) + '\n' +
" Tag: " + field_4_tag + '\n' +
" Size: " + field_5_size + '\n' +
" Ref: " + field_6_ref + '\n' +
Modified: poi/trunk/src/java/org/apache/poi/ddf/EscherDggRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ddf/EscherDggRecord.java?rev=786793&r1=786792&r2=786793&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ddf/EscherDggRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/ddf/EscherDggRecord.java Sat Jun 20 11:17:30 2009
@@ -122,7 +122,7 @@
public String toString() {
StringBuffer field_5_string = new StringBuffer();
- for (int i = 0; i < field_5_fileIdClusters.length; i++) {
+ if(field_5_fileIdClusters != null) for (int i = 0; i < field_5_fileIdClusters.length; i++) {
field_5_string.append(" DrawingGroupId").append(i+1).append(": ");
field_5_string.append(field_5_fileIdClusters[i].field_1_drawingGroupId);
field_5_string.append('\n');
@@ -156,7 +156,7 @@
* Number of id clusters + 1
*/
public int getNumIdClusters() {
- return field_5_fileIdClusters.length + 1;
+ return (field_5_fileIdClusters == null ? 0 : (field_5_fileIdClusters.length + 1));
}
public int getNumShapesSaved() {
Modified: poi/trunk/src/java/org/apache/poi/ddf/EscherMetafileBlip.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ddf/EscherMetafileBlip.java?rev=786793&r1=786792&r2=786793&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ddf/EscherMetafileBlip.java (original)
+++ poi/trunk/src/java/org/apache/poi/ddf/EscherMetafileBlip.java Sat Jun 20 11:17:30 2009
@@ -65,11 +65,11 @@
private byte field_7_fFilter;
private byte[] raw_pictureData;
+ private byte[] remainingData;
public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
int bytesAfterHeader = readHeader( data, offset );
int pos = offset + HEADER_SIZE;
-
field_1_UID = new byte[16];
System.arraycopy( data, pos, field_1_UID, 0, 16 ); pos += 16;
@@ -91,6 +91,7 @@
raw_pictureData = new byte[field_5_cbSave];
System.arraycopy( data, pos, raw_pictureData, 0, field_5_cbSave );
+ pos += field_5_cbSave;
// 0 means DEFLATE compression
// 0xFE means no compression
@@ -100,6 +101,11 @@
field_pictureData = raw_pictureData;
}
+ int remaining = bytesAfterHeader - pos + offset + HEADER_SIZE;
+ if(remaining > 0) {
+ remainingData = new byte[remaining];
+ System.arraycopy( data, pos, remainingData, 0, remaining );
+ }
return bytesAfterHeader + HEADER_SIZE;
}
@@ -126,7 +132,10 @@
data[pos] = field_6_fCompression; pos++;
data[pos] = field_7_fFilter; pos++;
- System.arraycopy( raw_pictureData, 0, data, pos, raw_pictureData.length );
+ System.arraycopy( raw_pictureData, 0, data, pos, raw_pictureData.length ); pos += raw_pictureData.length;
+ if(remainingData != null) {
+ System.arraycopy( remainingData, 0, data, pos, remainingData.length ); pos += remainingData.length;
+ }
listener.afterRecordSerialize(offset + getRecordSize(), getRecordId(), getRecordSize(), this);
return getRecordSize();
@@ -157,6 +166,7 @@
public int getRecordSize() {
int size = 8 + 50 + raw_pictureData.length;
+ if(remainingData != null) size += remainingData.length;
if((getOptions() ^ getSignature()) == 0x10){
size += field_2_UID.length;
}
@@ -227,10 +237,14 @@
field_6_fCompression = compressed ? 0 : (byte)0xFE;
}
+ public byte[] getRemainingData() {
+ return remainingData;
+ }
+
// filtering is always 254 according to available docs, so no point giving it a setter method.
public String toString() {
- String extraData = HexDump.toHex(field_pictureData, 32);
+ String extraData = "";//HexDump.toHex(field_pictureData, 32);
return getClass().getName() + ":" + '\n' +
" RecordId: 0x" + HexDump.toHex( getRecordId() ) + '\n' +
" Options: 0x" + HexDump.toHex( getOptions() ) + '\n' +
@@ -242,7 +256,9 @@
" Compressed Size: " + HexDump.toHex( field_5_cbSave ) + '\n' +
" Compression: " + HexDump.toHex( field_6_fCompression ) + '\n' +
" Filter: " + HexDump.toHex( field_7_fFilter ) + '\n' +
- " Extra Data:" + '\n' + extraData;
+ " Extra Data:" + '\n' + extraData +
+ (remainingData == null ? null : ("\n" +
+ " Remaining Data: " + HexDump.toHex(remainingData, 32)));
}
/**
Modified: poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherBlipRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherBlipRecord.java?rev=786793&r1=786792&r2=786793&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherBlipRecord.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherBlipRecord.java Sat Jun 20 11:17:30 2009
@@ -152,4 +152,22 @@
return data;
}
+ /**
+ * The test data was created from pl031405.xls attached to Bugzilla #47143
+ */
+ public void test47143() {
+ byte[] data = read(new File(cwd, "47143.dat"));
+ EscherBSERecord bse = new EscherBSERecord();
+ bse.fillFields(data, 0, new DefaultEscherRecordFactory());
+ bse.toString(); //assert that toString() works
+ assertTrue(bse.getBlipRecord() instanceof EscherMetafileBlip);
+
+ EscherMetafileBlip blip = (EscherMetafileBlip)bse.getBlipRecord();
+ blip.toString(); //assert that toString() works
+ byte[] remaining = blip.getRemainingData();
+ assertNotNull(remaining);
+
+ byte[] ser = bse.serialize(); //serialize and assert against the source data
+ assertTrue(Arrays.equals(data, ser));
+ }
}
Added: poi/trunk/src/testcases/org/apache/poi/ddf/data/47143.dat
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ddf/data/47143.dat?rev=786793&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/src/testcases/org/apache/poi/ddf/data/47143.dat
------------------------------------------------------------------------------
svn:executable = *
Propchange: poi/trunk/src/testcases/org/apache/poi/ddf/data/47143.dat
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org