mirror of https://github.com/apache/poi.git
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
This commit is contained in:
parent
4eb5150fc3
commit
146eadef69
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue