]> source.dussan.org Git - poi.git/commitdiff
Avoid exception when reading ClipboardData packet in OLE property sets, see bugzilla...
authorYegor Kozlov <yegor@apache.org>
Thu, 20 Aug 2009 13:49:33 +0000 (13:49 +0000)
committerYegor Kozlov <yegor@apache.org>
Thu, 20 Aug 2009 13:49:33 +0000 (13:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@806172 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/POIDocument.java
src/java/org/apache/poi/hpsf/Section.java
src/java/org/apache/poi/hpsf/VariantSupport.java
src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java
src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java
src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
src/scratchpad/src/org/apache/poi/hwpf/HWPFDocument.java
src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
src/testcases/org/apache/poi/hssf/data/42726.xls [new file with mode: 0755]

index 480b0a1a292198aaca3c61f761bd9aa10e1357a1..bded2bc4a5dbdaebb402737909127dc0e7afb04e 100644 (file)
@@ -33,7 +33,7 @@
 
     <changes>
         <release version="3.5-beta7" date="2009-??-??">
-           <action dev="POI-DEVELOPERS" type="add">47668 - Improved parsing of OOXML documents</action>
+           <action dev="POI-DEVELOPERS" type="add">45583 - Avoid exception when reading ClipboardData packet in OLE property sets</action>
            <action dev="POI-DEVELOPERS" type="add">47652 - Added support for reading encrypted workbooks</action>
            <action dev="POI-DEVELOPERS" type="add">47604 - Implementation of an XML to XLSX Importer using Custom XML Mapping</action>
            <action dev="POI-DEVELOPERS" type="fix">47620 - Avoid FormulaParseException in XSSFWorkbook.setRepeatingRowsAndColumns when removing repeated rows and columns</action>
index 4d7e50c0fb0c292a0ce281c3a3a6733bfff5482f..15571601b45d2d7ae21d02371843058ddbd02d3c 100644 (file)
@@ -47,19 +47,19 @@ import org.apache.poi.util.POILogger;
  */
 public abstract class POIDocument {
        /** Holds metadata on our document */
-       protected SummaryInformation sInf;
+       private SummaryInformation sInf;
        /** Holds further metadata on our document */
-       protected DocumentSummaryInformation dsInf;
+       private DocumentSummaryInformation dsInf;
        /** The open POIFS FileSystem that contains our document */
        protected POIFSFileSystem filesystem;
        /**     The directory that our document lives in */
        protected DirectoryNode directory;
        
        /** For our own logging use */
-       protected POILogger logger = POILogFactory.getLogger(this.getClass());
+       private final static POILogger logger = POILogFactory.getLogger(POIDocument.class);
 
     /* Have the property streams been read yet? (Only done on-demand) */
-    protected boolean initialized = false;
+    private boolean initialized = false;
     
 
     protected POIDocument(DirectoryNode dir, POIFSFileSystem fs) {
@@ -120,7 +120,10 @@ public abstract class POIDocument {
         *  if it wasn't found
         */
        protected PropertySet getPropertySet(String setName) {
-               DocumentInputStream dis;
+        //directory can be null when creating new documents
+        if(directory == null) return null;
+        
+        DocumentInputStream dis;
                try {
                        // Find the entry, and get an input stream for it
                        dis = directory.createDocumentInputStream(setName);
@@ -157,14 +160,16 @@ public abstract class POIDocument {
         * @param writtenEntries a list of POIFS entries to add the property names too
         */
        protected void writeProperties(POIFSFileSystem outFS, List writtenEntries) throws IOException {
-        if(sInf != null) {
-                       writePropertySet(SummaryInformation.DEFAULT_STREAM_NAME,sInf,outFS);
+        SummaryInformation si = getSummaryInformation();
+        if(si != null) {
+                       writePropertySet(SummaryInformation.DEFAULT_STREAM_NAME, si, outFS);
                        if(writtenEntries != null) {
                                writtenEntries.add(SummaryInformation.DEFAULT_STREAM_NAME);
                        }
                }
-               if(dsInf != null) {
-                       writePropertySet(DocumentSummaryInformation.DEFAULT_STREAM_NAME,dsInf,outFS);
+        DocumentSummaryInformation dsi = getDocumentSummaryInformation();
+        if(dsi != null) {
+                       writePropertySet(DocumentSummaryInformation.DEFAULT_STREAM_NAME, dsi, outFS);
                        if(writtenEntries != null) {
                                writtenEntries.add(DocumentSummaryInformation.DEFAULT_STREAM_NAME);
                        }
index a9ea717c010e2881f2ed7cd13ee65f60ac6cfe6d..525450e7990666ef95b4e42aaa12238a2153b43a 100644 (file)
@@ -240,16 +240,6 @@ public class Section
         {
             ple = propertyList.get(propertyCount - 1);
             ple.length = size - ple.offset;
-            if (ple.length <= 0)
-            {
-                final StringBuffer b = new StringBuffer();
-                b.append("The property set claims to have a size of ");
-                b.append(size);
-                b.append(" bytes. However, it exceeds ");
-                b.append(ple.offset);
-                b.append(" bytes.");
-                throw new IllegalPropertySetDataException(b.toString());
-            }
         }
 
         /* Look for the codepage. */
index 1b06e239aaf53bebea3fafd556fc641bc187f286..e96e6739df8214649ccbbe2a9914b0c70be0abdd 100644 (file)
@@ -272,9 +272,20 @@ public class VariantSupport extends Variant
             }
             case Variant.VT_CF:
             {
+                if(l1 < 0) {
+                    /**
+                     *  YK: reading the ClipboardData packet (VT_CF) is not quite correct.
+                     *  The size of the data is determined by the first four bytes of the packet
+                     *  while the current implementation calculates it in the Section constructor.
+                     *  Test files in Bugzilla 42726 and 45583 clearly show that this approach does not always work.
+                     *  The workaround below attempts to gracefully handle such cases instead of throwing exceptions.
+                     * 
+                     *  August 20, 2009
+                     */
+                    l1 = LittleEndian.getInt(src, o1); o1 += LittleEndian.INT_SIZE;
+                }
                 final byte[] v = new byte[l1];
-                for (int i = 0; i < l1; i++)
-                    v[i] = src[(o1 + i)];
+                System.arraycopy(src, o1, v, 0, v.length);
                 value = v;
                 break;
             }
@@ -509,7 +520,7 @@ public class VariantSupport extends Variant
             }
             case Variant.VT_CF:
             {
-                final byte[] b = (byte[]) value; 
+                final byte[] b = (byte[]) value;
                 out.write(b);
                 length = b.length;
                 break;
index 1a6b12614529e919e113c61730c1b23587e9c8b9..450e8d3b4b582f001b4193beb2f5261cfaafaf7f 100644 (file)
@@ -55,7 +55,7 @@ public class HPSFPropertiesExtractor extends POITextExtractor {
                text.append( getPropertiesText(dsi) );
 
                // Now custom ones
-               CustomProperties cps = dsi.getCustomProperties();
+               CustomProperties cps = dsi == null ? null : dsi.getCustomProperties();
                if(cps != null) {
                        Iterator keys = cps.keySet().iterator();
                        while(keys.hasNext()) {
index 483762484dedc6e518df7263ad980ee71e536065..aa15ce1b13c997f199ec5aa282527bb0044f3a76 100644 (file)
@@ -68,9 +68,6 @@ public final class HDGFDiagram extends POIDocument {
                _docstream = new byte[docProps.getSize()];
                dir.createDocumentInputStream("VisioDocument").read(_docstream);
 
-               // Read in the common POI streams
-               readProperties();
-
                // Check it's really visio
                String typeString = new String(_docstream, 0, 20);
                if(! typeString.equals(VISIO_HEADER)) {
index 90b2cfd3ed2ed0ce062e5ad9053352b39c025b4a..df4d291f514c7ac37fe3d609b4890ec530b2161a 100644 (file)
@@ -146,9 +146,6 @@ public final class HSLFSlideShow extends POIDocument {
                // Now, build records based on the PowerPoint stream
                buildRecords();
 
-               // Look for Property Streams:
-               readProperties();
-
                // Look for any other streams
                readOtherStreams();
 
index 8b6d2fdae72e84695c5d9b21f1842aeb7340ef92..db4acdd09550cf0f24d7cf782643234b80da5f91 100644 (file)
@@ -170,7 +170,6 @@ public final class HWPFDocument extends POIDocument
   {
     // Sort out the hpsf properties
        super(directory, pfilesystem);
-    readProperties();
 
     // read in the main stream.
     DocumentEntry documentProps = (DocumentEntry)
index e05cbc6badad621c99cfbb0bee3e618088e35083..2bdc3c08d2207a21b61f2fda43ddb14520c5ada4 100644 (file)
@@ -25,6 +25,7 @@ import junit.framework.TestCase;
 
 import org.apache.poi.hssf.extractor.ExcelExtractor;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 
 public final class TestHPSFPropertiesExtractor extends TestCase {
@@ -117,4 +118,13 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
                assertTrue(fsText.indexOf("AUTHOR = marshall") > -1);
                assertTrue(fsText.indexOf("TITLE = Titel: \u00c4h") > -1);
        }
+
+    public void test42726() throws Exception {
+        HPSFPropertiesExtractor ex = new HPSFPropertiesExtractor(HSSFTestDataSamples.openSampleWorkbook("42726.xls"));
+        String txt = ex.getText();
+        assertTrue(txt.indexOf("PID_AUTHOR") != -1);
+        assertTrue(txt.indexOf("PID_EDITTIME") != -1);
+        assertTrue(txt.indexOf("PID_REVNUMBER") != -1);
+        assertTrue(txt.indexOf("PID_THUMBNAIL") != -1);
+    }
 }
diff --git a/src/testcases/org/apache/poi/hssf/data/42726.xls b/src/testcases/org/apache/poi/hssf/data/42726.xls
new file mode 100755 (executable)
index 0000000..e492c5d
Binary files /dev/null and b/src/testcases/org/apache/poi/hssf/data/42726.xls differ