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