diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2014-02-19 23:45:07 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2014-02-19 23:45:07 +0000 |
commit | 146eadef698bf6a38161931151ccccf1784a3c17 (patch) | |
tree | 052c3020634828cf239b917524c184d13b2412d9 | |
parent | 4eb5150fc352f9485652ea51778b8cfa94c44872 (diff) | |
download | poi-146eadef698bf6a38161931151ccccf1784a3c17.tar.gz poi-146eadef698bf6a38161931151ccccf1784a3c17.zip |
Bug 55732 - PPT can't open, fails with "Couldn't instantiate .... StyleTextProp9Atom : java.lang.ArrayIndexOutOfBoundsException: 56"
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1569984 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java | 65 | ||||
-rw-r--r-- | src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java | 18 | ||||
-rw-r--r-- | test-data/slideshow/bug55732.ppt | bin | 0 -> 99840 bytes |
3 files changed, 54 insertions, 29 deletions
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java index 17c9107e43..9f8aec7f48 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java @@ -27,11 +27,9 @@ import org.apache.poi.util.LittleEndian; /** * The atom record that specifies additional text formatting. - * - * @author Alex Nikiforov [mailto:anikif@gmail.com] */ public final class StyleTextProp9Atom extends RecordAtom { - private final TextPFException9[] autoNumberSchemes; + private final TextPFException9[] autoNumberSchemes; /** Record header. */ private byte[] header; /** Record data. */ @@ -50,7 +48,7 @@ public final class StyleTextProp9Atom extends RecordAtom { */ protected StyleTextProp9Atom(byte[] source, int start, int len) { // Get the header. - final List<TextPFException9> schemes = new LinkedList<TextPFException9>(); + final List<TextPFException9> schemes = new LinkedList<TextPFException9>(); header = new byte[8]; System.arraycopy(source,start, header,0,8); this.version = LittleEndian.getShort(header, 0); @@ -61,42 +59,51 @@ public final class StyleTextProp9Atom extends RecordAtom { data = new byte[len-8]; System.arraycopy(source, start+8, data, 0, len-8); for (int i = 0; i < data.length; ) { - final TextPFException9 item = new TextPFException9(data, i); - schemes.add(item); - i += item.getRecordLength(); - //int textCfException9 = LittleEndian.getInt(data, i ); - //TODO analyze textCfException when have some test data - i += 4; - int textSiException = LittleEndian.getInt(data, i ); - i += + 4;//TextCFException9 + SIException - if (0 != (textSiException & 0x40)) { - i += 2; //skip fBidi - } - if (i >= data.length) { - break; - } + final TextPFException9 item = new TextPFException9(data, i); + schemes.add(item); + i += item.getRecordLength(); + + if (i >= data.length) { + break; + } + int textCfException9 = LittleEndian.getInt(data, i ); + i += 4; + //TODO analyze textCfException when have some test data + + if (i >= data.length) { + break; + } + int textSiException = LittleEndian.getInt(data, i ); + i += 4;//TextCFException9 + SIException + + if (0 != (textSiException & 0x40)) { + i += 2; //skip fBidi + } + if (i >= data.length) { + break; + } } this.autoNumberSchemes = (TextPFException9[]) schemes.toArray(new TextPFException9[schemes.size()]); } - /** + /** * Gets the record type. * @return the record type. */ public long getRecordType() { return this.recordId; } public short getVersion() { - return version; - } + return version; + } - public int getLength() { - return length; - } - public TextPFException9[] getAutoNumberTypes() { - return this.autoNumberSchemes; - } + public int getLength() { + return length; + } + public TextPFException9[] getAutoNumberTypes() { + return this.autoNumberSchemes; + } - /** + /** * Write the contents of the record back, so it can be written * to disk * @@ -133,4 +140,4 @@ public final class StyleTextProp9Atom extends RecordAtom { // Update the size (header bytes 5-8) LittleEndian.putInt(header, 4, data.length); } -} +}
\ No newline at end of file diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java index b5683a1eab..50b21a007d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; @@ -38,6 +39,7 @@ 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; +import org.apache.poi.hslf.model.HeadersFooters; import org.apache.poi.hslf.model.MasterSheet; import org.apache.poi.hslf.model.Notes; import org.apache.poi.hslf.model.Picture; @@ -484,4 +486,20 @@ public final class TestBugs { } } + @Test + public void bug55732() throws Exception { + File file = _slTests.getFile("bug55732.ppt"); + + HSLFSlideShow ss = new HSLFSlideShow(file.getAbsolutePath()); + SlideShow _show = new SlideShow(ss); + Slide[] _slides = _show.getSlides(); + + /* Iterate over slides and extract text */ + for( Slide slide : _slides ) { + HeadersFooters hf = slide.getHeadersFooters(); + boolean visible = hf.isHeaderVisible(); // exception happens here + } + assertTrue("No Exceptions while reading headers", true); + } + } diff --git a/test-data/slideshow/bug55732.ppt b/test-data/slideshow/bug55732.ppt Binary files differnew file mode 100644 index 0000000000..c0f84ac670 --- /dev/null +++ b/test-data/slideshow/bug55732.ppt |