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: [email protected]
For additional commands, e-mail: [email protected]