Author: kiwiwings
Date: Fri Dec 27 23:42:34 2013
New Revision: 1553760

URL: http://svn.apache.org/r1553760
Log:
Bug 41246 - AIOOBE with missing notes entries

Added:
    poi/trunk/test-data/slideshow/41246-1.ppt   (with props)
    poi/trunk/test-data/slideshow/41246-2.ppt   (with props)
Modified:
    poi/site/src/documentation/content/xdocs/status.xml
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
    
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java

Modified: poi/site/src/documentation/content/xdocs/status.xml
URL: 
http://svn.apache.org/viewvc/poi/site/src/documentation/content/xdocs/status.xml?rev=1553760&r1=1553759&r2=1553760&view=diff
==============================================================================
--- poi/site/src/documentation/content/xdocs/status.xml (original)
+++ poi/site/src/documentation/content/xdocs/status.xml Fri Dec 27 23:42:34 2013
@@ -36,6 +36,8 @@
 
     <changes>
         <release version="3.10-beta3" date="2013-10-??">
+          <action dev="poi-developers" type="fix">41246 - AIOOBE with missing 
notes entries</action>
+          <action dev="poi-developers" type="fix">48593 - Multiple Saves 
Causes Slide Corruption</action>
           <action dev="poi-developers" type="add">55579 - Support embedding 
OLE objects into HSLF</action>
           <action dev="poi-developers" type="add">55818 - Add encryption 
support</action>
           <action dev="poi-developers" type="fix">55901 - Avoid using RMI 
based exception from PropertySetFactory, as it's not needed nor helpful</action>

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java?rev=1553760&r1=1553759&r2=1553760&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java 
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java Fri Dec 
27 23:42:34 2013
@@ -274,11 +274,11 @@ public final class HSLFSlideShow extends
         HashMap<Integer,Integer> offset2id = new HashMap<Integer,Integer>();
         while (usrOffset != 0){
             UserEditAtom usr = (UserEditAtom) 
Record.buildRecordAtOffset(docstream, usrOffset);
-            lst.add(Integer.valueOf(usrOffset));
+            lst.add(usrOffset);
             int psrOffset = usr.getPersistPointersOffset();
 
             PersistPtrHolder ptr = 
(PersistPtrHolder)Record.buildRecordAtOffset(docstream, psrOffset);
-            lst.add(Integer.valueOf(psrOffset));
+            lst.add(psrOffset);
             Hashtable<Integer,Integer> entries = ptr.getSlideLocationsLookup();
             for(Integer id : entries.keySet()) {
                 Integer offset = entries.get(id);

Modified: 
poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java?rev=1553760&r1=1553759&r2=1553760&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java 
(original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java 
Fri Dec 27 23:42:34 2013
@@ -203,32 +203,33 @@ public final class SlideShow {
                        _sheetIdToCoreRecordsLookup.put(allIDs[i], i);
                }
 
+               Map<Integer,Integer> mostRecentByBytesRev = new 
HashMap<Integer,Integer>(mostRecentByBytes.size());
+               for (Map.Entry<Integer,Integer> me : 
mostRecentByBytes.entrySet()) {
+                   mostRecentByBytesRev.put(me.getValue(), me.getKey());
+               }
+               
                // Now convert the byte offsets back into record offsets
                for (Record record : _hslfSlideShow.getRecords()) {
-                       if (record instanceof PositionDependentRecord) {
-                               PositionDependentRecord pdr = 
(PositionDependentRecord) record;
-                               int recordAt = pdr.getLastOnDiskOffset();
-
-                               // Is it one we care about?
-                               for (Integer thisID : allIDs) {
-                                       int thatRecordAt = 
mostRecentByBytes.get(thisID);
-
-                                       if (thatRecordAt == recordAt) {
-                                               // Bingo. Now, where do we 
store it?
-                                               Integer storeAtI = 
_sheetIdToCoreRecordsLookup.get(thisID);
-                                               int storeAt = 
storeAtI.intValue();
-
-                                               // Tell it its Sheet ID, if it 
cares
-                                               if (pdr instanceof 
PositionDependentRecordContainer) {
-                                                       
PositionDependentRecordContainer pdrc = (PositionDependentRecordContainer) 
record;
-                                                       pdrc.setSheetId(thisID);
-                                               }
-
-                                               // Finally, save the record
-                                               _mostRecentCoreRecords[storeAt] 
= record;
-                                       }
-                               }
+                       if (!(record instanceof PositionDependentRecord)) 
continue;
+                       
+                       PositionDependentRecord pdr = (PositionDependentRecord) 
record;
+                       int recordAt = pdr.getLastOnDiskOffset();
+
+                       Integer thisID = mostRecentByBytesRev.get(recordAt);
+                       
+                       if (thisID == null) continue;
+                       
+                       // Bingo. Now, where do we store it?
+                       int storeAt = _sheetIdToCoreRecordsLookup.get(thisID);
+
+                       // Tell it its Sheet ID, if it cares
+                       if (pdr instanceof PositionDependentRecordContainer) {
+                               PositionDependentRecordContainer pdrc = 
(PositionDependentRecordContainer) record;
+                               pdrc.setSheetId(thisID);
                        }
+
+                       // Finally, save the record
+                       _mostRecentCoreRecords[storeAt] = record;
                }
 
                // Now look for the interesting records in there
@@ -265,9 +266,9 @@ public final class SlideShow {
         *            the refID
         */
        private Record getCoreRecordForRefID(int refID) {
-               Integer coreRecordId = 
_sheetIdToCoreRecordsLookup.get(Integer.valueOf(refID));
+               Integer coreRecordId = _sheetIdToCoreRecordsLookup.get(refID);
                if (coreRecordId != null) {
-                       Record r = 
_mostRecentCoreRecords[coreRecordId.intValue()];
+                       Record r = _mostRecentCoreRecords[coreRecordId];
                        return r;
                }
                logger.log(POILogger.ERROR,
@@ -361,7 +362,15 @@ public final class SlideShow {
                                Record r = getCoreRecordForSAS(notesSets[i]);
 
                                // Ensure it really is a notes record
-                               if (r instanceof 
org.apache.poi.hslf.record.Notes) {
+                               if (r == null || r instanceof 
org.apache.poi.hslf.record.Notes) {
+                                   if (r == null) {
+                           logger.log(POILogger.WARN, "A Notes SlideAtomSet at 
" + i
+                                   + " said its record was at refID "
+                                   + 
notesSets[i].getSlidePersistAtom().getRefID()
+                                   + ", but that record didn't exist - record 
ignored.");
+                                   }
+                                   // we need to add also null-records, 
otherwise the index references to other existing
+                                   // don't work anymore
                                        org.apache.poi.hslf.record.Notes 
notesRecord = (org.apache.poi.hslf.record.Notes) r;
                                        notesRecordsL.add(notesRecord);
 
@@ -410,8 +419,10 @@ public final class SlideShow {
                // Notes first
                _notes = new Notes[notesRecords.length];
                for (int i = 0; i < _notes.length; i++) {
-                       _notes[i] = new Notes(notesRecords[i]);
-                       _notes[i].setSlideShow(this);
+                   if (notesRecords[i] != null) {
+                   _notes[i] = new Notes(notesRecords[i]);
+                       _notes[i].setSlideShow(this);
+                   }
                }
                // Then slides
                _slides = new Slide[slidesRecords.length];
@@ -425,11 +436,12 @@ public final class SlideShow {
                        // 0 if slide has no notes.
                        int noteId = 
slidesRecords[i].getSlideAtom().getNotesID();
                        if (noteId != 0) {
-                               Integer notesPos = (Integer) 
slideIdToNotes.get(Integer.valueOf(noteId));
-                               if (notesPos != null)
-                                       notes = _notes[notesPos.intValue()];
-                               else
+                               Integer notesPos = slideIdToNotes.get(noteId);
+                               if (notesPos != null) {
+                                       notes = _notes[notesPos];
+                               } else {
                                        logger.log(POILogger.ERROR, "Notes not 
found for noteId=" + noteId);
+                               }
                        }
 
                        // Now, build our slide

Modified: 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java?rev=1553760&r1=1553759&r2=1553760&view=diff
==============================================================================
--- 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java 
(original)
+++ 
poi/trunk/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java 
Fri Dec 27 23:42:34 2013
@@ -17,6 +17,7 @@
 
 package org.apache.poi.hslf.usermodel;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -27,7 +28,9 @@ import java.util.Set;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.HSLFTestDataSamples;
 import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
 import org.apache.poi.hslf.model.Background;
 import org.apache.poi.hslf.model.Fill;
@@ -42,7 +45,6 @@ import org.apache.poi.hslf.model.TextBox
 import org.apache.poi.hslf.model.TextRun;
 import org.apache.poi.hslf.model.TextShape;
 import org.apache.poi.hslf.model.TitleMaster;
-import org.apache.poi.POIDataSamples;
 
 /**
  * Testcases for bugs entered in bugzilla
@@ -406,4 +408,31 @@ public final class TestBugs extends Test
           }
        }
     }
+
+    /**
+     * Bug 41246: AIOOB with illegal note references
+     */
+    public void test41246a() throws Exception {
+        InputStream fis = _slTests.openResourceAsStream("41246-1.ppt");
+        HSLFSlideShow hslf = new HSLFSlideShow(fis);
+        fis.close();
+
+        SlideShow ppt = new SlideShow(hslf);
+        assertTrue("No Exceptions while reading file", true);
+
+        ppt = HSLFTestDataSamples.writeOutAndReadBack(ppt);
+        assertTrue("No Exceptions while rewriting file", true);
+    }
+
+    public void test41246b() throws Exception {
+        InputStream fis = _slTests.openResourceAsStream("41246-2.ppt");
+        HSLFSlideShow hslf = new HSLFSlideShow(fis);
+        fis.close();
+
+        SlideShow ppt = new SlideShow(hslf);
+        assertTrue("No Exceptions while reading file", true);
+
+        ppt = HSLFTestDataSamples.writeOutAndReadBack(ppt);
+        assertTrue("No Exceptions while rewriting file", true);
+    }
 }

Added: poi/trunk/test-data/slideshow/41246-1.ppt
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/slideshow/41246-1.ppt?rev=1553760&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/slideshow/41246-1.ppt
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: poi/trunk/test-data/slideshow/41246-2.ppt
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/slideshow/41246-2.ppt?rev=1553760&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/slideshow/41246-2.ppt
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to