]> source.dussan.org Git - poi.git/commitdiff
Fix from Trejkaz from bug #44857 - Avoid OOM on unknown escher records when EscherMet...
authorNick Burch <nick@apache.org>
Sun, 27 Apr 2008 18:02:13 +0000 (18:02 +0000)
committerNick Burch <nick@apache.org>
Sun, 27 Apr 2008 18:02:13 +0000 (18:02 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@651992 13f79535-47bb-0310-9956-ffa450edef68

build.xml
src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/ddf/EscherMetafileBlip.java
src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java
src/testcases/org/apache/poi/ddf/data/Container.dat [new file with mode: 0644]

index cdcd7924e22c06c2d46ceef6543c3823e83d064c..f6ecddc0cba711c8599d0bff724ddc04a513fd86 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -401,6 +401,8 @@ under the License.
         file="${main.src.test}/org/apache/poi/hpsf/data"/> 
       <sysproperty key="POIFS.testdata.path"
         file="${main.src.test}/org/apache/poi/poifs/data"/> 
+      <sysproperty key="DDF.testdata.path"
+        file="${main.src.test}/org/apache/poi/ddf/data"/> 
       <sysproperty key="java.awt.headless" value="true"/>
       <formatter type="plain"/>
       <formatter type="xml"/>
index 336ac06154d2b5de15e98f28e4382099d2c6a6e0..b0dab58f451034913712078823dcc376c77c0deb 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1-beta1" date="2008-04-??">
+           <action dev="POI-DEVELOPERS" type="fix">44857 - Avoid OOM on unknown escher records when EscherMetafileBlip is incorrect</action>
            <action dev="POI-DEVELOPERS" type="add">HSLF: Support for getting embedded sounds from slide show </action>
            <action dev="POI-DEVELOPERS" type="add">HSLF: Initial support for rendering slides into images</action>
            <action dev="POI-DEVELOPERS" type="add">HSLF: Support for getting OLE object data from slide show </action>
index c61f2b1db4b5a663384aaf1ebe7f603e26fe6614..3a74e26f39916cd8f0fa4d8d534e927cecc71f6c 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1-beta1" date="2008-04-??">
+           <action dev="POI-DEVELOPERS" type="fix">44857 - Avoid OOM on unknown escher records when EscherMetafileBlip is incorrect</action>
            <action dev="POI-DEVELOPERS" type="add">HSLF: Support for getting embedded sounds from slide show </action>
            <action dev="POI-DEVELOPERS" type="add">HSLF: Initial support for rendering slides into images</action>
            <action dev="POI-DEVELOPERS" type="add">HSLF: Support for getting OLE object data from slide show </action>
index f2dc1bb01427740e098a29dffcaba231a2f319e7..99faa61bc2d9539ec2b012901c51b2de7a7dc05a 100644 (file)
@@ -83,8 +83,11 @@ public class EscherMetafileBlip
         field_6_fCompression = data[pos]; pos++;
         field_7_fFilter = data[pos]; pos++;
 
-        raw_pictureData = new byte[field_5_cbSave];
-        System.arraycopy( data, pos, raw_pictureData, 0, field_5_cbSave );
+        // Bit of a snag - trusting field_5_cbSave results in inconsistent
+        //  record size in some cases. So, just check the data left
+        int remainingBytes = bytesAfterHeader - 50;
+        raw_pictureData = new byte[remainingBytes];
+        System.arraycopy( data, pos, raw_pictureData, 0, remainingBytes );
 
         // 0 means DEFLATE compression
         // 0xFE means no compression
index 7c139827b6bf3e39723626e84a7249f0fae9d9e7..0f1fc9c7330e1d4f690cc3160a9c5cd225282c9e 100644 (file)
         
 package org.apache.poi.ddf;
 
+import java.io.File;
+import java.io.FileInputStream;
+
 import junit.framework.TestCase;
 import org.apache.poi.util.HexRead;
 import org.apache.poi.util.HexDump;
+import org.apache.poi.util.IOUtils;
 
 public class TestEscherContainerRecord extends TestCase
 {
-    public void testFillFields() throws Exception
+       private String ESCHER_DATA_PATH;
+       
+       protected void setUp() throws Exception {
+               super.setUp();
+               ESCHER_DATA_PATH = System.getProperty("DDF.testdata.path");
+       }
+
+       public void testFillFields() throws Exception
     {
         EscherRecordFactory f = new DefaultEscherRecordFactory();
         byte[] data = HexRead.readFromString( "0F 02 11 F1 00 00 00 00" );
@@ -137,4 +148,19 @@ public class TestEscherContainerRecord extends TestCase
         assertEquals(18, r.getRecordSize());
     }
 
+    /**
+     * We were having problems with reading too much data on an UnknownEscherRecord,
+     *  but hopefully we now read the correct size.
+     */
+    public void testBug44857() throws Exception {
+       File f = new File(ESCHER_DATA_PATH, "Container.dat");
+       assertTrue(f.exists());
+       
+       FileInputStream finp = new FileInputStream(f);
+       byte[] data = IOUtils.toByteArray(finp);
+       
+       // This used to fail with an OutOfMemory
+       EscherContainerRecord record = new EscherContainerRecord();
+       record.fillFields(data, 0, new DefaultEscherRecordFactory());
+    }
 }
diff --git a/src/testcases/org/apache/poi/ddf/data/Container.dat b/src/testcases/org/apache/poi/ddf/data/Container.dat
new file mode 100644 (file)
index 0000000..c1b5447
Binary files /dev/null and b/src/testcases/org/apache/poi/ddf/data/Container.dat differ