Fix 47958 - ArrayIndexOutOfBoundsException from PicturesTable.getAllPictures() during Escher tree walk

Fix 50936 - Exception parsing MS Word 8.0 file (as duplicate of 47958)

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1195080 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Sergey Vladimirov 2011-10-30 00:33:44 +00:00
parent 2ac2e79652
commit 16ff31e5ad
6 changed files with 61 additions and 27 deletions

View File

@ -34,6 +34,8 @@
<changes> <changes>
<release version="3.8-beta5" date="2011-??-??"> <release version="3.8-beta5" date="2011-??-??">
<action dev="poi-developers" type="fix">50936 - Exception parsing MS Word 8.0 file (as duplicate of 47958)</action>
<action dev="poi-developers" type="fix">47958 - ArrayIndexOutOfBoundsException from PicturesTable.getAllPictures() during Escher tree walk</action>
<action dev="poi-developers" type="fix">51944 - PAPFormattedDiskPage.getPAPX - IndexOutOfBounds</action> <action dev="poi-developers" type="fix">51944 - PAPFormattedDiskPage.getPAPX - IndexOutOfBounds</action>
<action dev="poi-developers" type="fix">52032 - HWPF - ArrayIndexOutofBoundsException with no stack trace (broken after revision 1178063)</action> <action dev="poi-developers" type="fix">52032 - HWPF - ArrayIndexOutofBoundsException with no stack trace (broken after revision 1178063)</action>
<action dev="poi-developers" type="add">support for converting pptx files into images with a PPTX2PNG tool</action> <action dev="poi-developers" type="add">support for converting pptx files into images with a PPTX2PNG tool</action>

View File

@ -20,6 +20,10 @@ package org.apache.poi.hwpf.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.ddf.DefaultEscherRecordFactory; import org.apache.poi.ddf.DefaultEscherRecordFactory;
import org.apache.poi.ddf.EscherBSERecord; import org.apache.poi.ddf.EscherBSERecord;
import org.apache.poi.ddf.EscherBlipRecord; import org.apache.poi.ddf.EscherBlipRecord;
@ -52,6 +56,9 @@ import org.apache.poi.util.LittleEndian;
@Internal @Internal
public final class PicturesTable public final class PicturesTable
{ {
private static final POILogger logger = POILogFactory
.getLogger( PicturesTable.class );
static final int TYPE_IMAGE = 0x08; static final int TYPE_IMAGE = 0x08;
static final int TYPE_IMAGE_WORD2000 = 0x00; static final int TYPE_IMAGE_WORD2000 = 0x00;
static final int TYPE_IMAGE_PASTED_FROM_CLIPBOARD = 0xA; static final int TYPE_IMAGE_PASTED_FROM_CLIPBOARD = 0xA;
@ -175,18 +182,32 @@ public final class PicturesTable
{ {
pictures.add(new Picture(blip.getPicturedata())); pictures.add(new Picture(blip.getPicturedata()));
} }
else if (bse.getOffset() > 0) else if ( bse.getOffset() > 0 )
{ {
// Blip stored in delay stream, which in a word doc, is the main stream try
EscherRecordFactory recordFactory = new DefaultEscherRecordFactory(); {
EscherRecord record = recordFactory.createRecord(_mainStream, bse.getOffset()); // Blip stored in delay stream, which in a word doc, is
// the main stream
EscherRecordFactory recordFactory = new DefaultEscherRecordFactory();
EscherRecord record = recordFactory.createRecord(
_mainStream, bse.getOffset() );
if (record instanceof EscherBlipRecord) { if ( record instanceof EscherBlipRecord )
record.fillFields(_mainStream, bse.getOffset(), recordFactory); {
blip = (EscherBlipRecord) record; record.fillFields( _mainStream, bse.getOffset(),
pictures.add(new Picture(blip.getPicturedata())); recordFactory );
} blip = (EscherBlipRecord) record;
} pictures.add( new Picture( blip.getPicturedata() ) );
}
}
catch ( Exception exc )
{
logger.log(
POILogger.WARN,
"Unable to load picture from BLIB record at offset #",
Integer.valueOf( bse.getOffset() ), exc );
}
}
} }
// Recursive call. // Recursive call.

View File

@ -463,23 +463,12 @@ public class TestBugs extends TestCase
} }
/** /**
* [FAILING] Bug 47958 - Exception during Escher walk of pictures * Bug 47958 - Exception during Escher walk of pictures
*/ */
public void test47958() public void test47958()
{ {
HWPFDocument doc = HWPFTestDataSamples.openSampleFile( "Bug47958.doc" ); HWPFDocument doc = HWPFTestDataSamples.openSampleFile( "Bug47958.doc" );
try doc.getPicturesTable().getAllPictures();
{
for ( Picture pic : doc.getPicturesTable().getAllPictures() )
{
System.out.println( pic.suggestFullFileName() );
}
fixed( "47958" );
}
catch ( Exception e )
{
// expected exception
}
} }
/** /**
@ -513,11 +502,33 @@ public class TestBugs extends TestCase
} }
/** /**
* Bug 50936 - HWPF fails to read a file * Bug 50936 - Exception parsing MS Word 8.0 file
*/ */
public void test50936() public void test50936_1()
{ {
HWPFTestDataSamples.openSampleFile( "Bug50936.doc" ); HWPFDocument hwpfDocument = HWPFTestDataSamples
.openSampleFile( "Bug50936_1.doc" );
hwpfDocument.getPicturesTable().getAllPictures();
}
/**
* Bug 50936 - Exception parsing MS Word 8.0 file
*/
public void test50936_2()
{
HWPFDocument hwpfDocument = HWPFTestDataSamples
.openSampleFile( "Bug50936_2.doc" );
hwpfDocument.getPicturesTable().getAllPictures();
}
/**
* Bug 50936 - Exception parsing MS Word 8.0 file
*/
public void test50936_3()
{
HWPFDocument hwpfDocument = HWPFTestDataSamples
.openSampleFile( "Bug50936_3.doc" );
hwpfDocument.getPicturesTable().getAllPictures();
} }
/** /**

Binary file not shown.

Binary file not shown.