Add (and throw) an exception if the powerpoint file is corrupt in a way that some seem to be (first record is of type 0000, and length is 0xFFFF)

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@365615 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2006-01-03 11:54:38 +00:00
parent b57336834b
commit 730cbcd0d3
3 changed files with 45 additions and 3 deletions

View File

@ -0,0 +1,34 @@
/* ====================================================================
Copyright 2002-2004 Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hslf.exceptions;
/**
* This exception is thrown when we try to open a PowerPoint file, and
* something is fundamentally broken about it.
*
* @author Nick Burch
*/
public class CorruptPowerPointFileException extends IllegalStateException
{
public CorruptPowerPointFileException(String s) {
super(s);
}
}

View File

@ -24,6 +24,7 @@ import java.io.OutputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.util.Vector; import java.util.Vector;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
/** /**
@ -83,7 +84,7 @@ public abstract class Record
} }
/** /**
* Default method for finding child records of a given record * Default method for finding child records of a container record
*/ */
public static Record[] findChildRecords(byte[] b, int start, int len) { public static Record[] findChildRecords(byte[] b, int start, int len) {
Vector children = new Vector(5); Vector children = new Vector(5);
@ -98,6 +99,12 @@ public abstract class Record
int rleni = (int)rlen; int rleni = (int)rlen;
if(rleni < 0) { rleni = 0; } if(rleni < 0) { rleni = 0; }
// Abort if first record is of type 0000 and length FFFF,
// as that's a sign of a screwed up record
if(pos == 0 && type == 0l && rleni == 0xffff) {
throw new CorruptPowerPointFileException("Corrupt document - starts with record of type 0000 and length 0xFFFF");
}
//System.out.println("Found a " + type + " at pos " + pos + " (" + Integer.toHexString(pos) + "), len " + rlen); //System.out.println("Found a " + type + " at pos " + pos + " (" + Integer.toHexString(pos) + "), len " + rlen);
Record r = createRecordForType(type,b,pos,8+rleni); Record r = createRecordForType(type,b,pos,8+rleni);
children.add(r); children.add(r);
@ -148,7 +155,7 @@ public abstract class Record
} catch(InstantiationException ie) { } catch(InstantiationException ie) {
throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ie); throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ie);
} catch(java.lang.reflect.InvocationTargetException ite) { } catch(java.lang.reflect.InvocationTargetException ite) {
throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ite); throw new RuntimeException("Couldn't instantiate the class for type with id " + type + " on class " + c + " : " + ite + "\nCause was : " + ite.getCause());
} catch(IllegalAccessException iae) { } catch(IllegalAccessException iae) {
throw new RuntimeException("Couldn't access the constructor for type with id " + type + " on class " + c + " : " + iae); throw new RuntimeException("Couldn't access the constructor for type with id " + type + " on class " + c + " : " + iae);
} catch(NoSuchMethodException nsme) { } catch(NoSuchMethodException nsme) {

View File

@ -36,6 +36,7 @@ import org.apache.poi.hslf.record.SlideListWithText;
import org.apache.poi.hslf.record.SlideListWithText.*; import org.apache.poi.hslf.record.SlideListWithText.*;
import org.apache.poi.hslf.record.PersistPtrHolder; import org.apache.poi.hslf.record.PersistPtrHolder;
import org.apache.poi.hslf.record.PositionDependentRecord; import org.apache.poi.hslf.record.PositionDependentRecord;
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
/** /**
* This class is a friendly wrapper on top of the more scary HSLFSlideShow. * This class is a friendly wrapper on top of the more scary HSLFSlideShow.
@ -227,7 +228,7 @@ public class SlideShow
// Ensure we really found a Document record // Ensure we really found a Document record
// If we didn't, then the file is probably corrupt // If we didn't, then the file is probably corrupt
if(documentRecord == null) { if(documentRecord == null) {
throw new IllegalStateException("The PowerPoint file didn't contain a Document Record in its PersistPtr blocks. It is probably corrupt."); throw new CorruptPowerPointFileException("The PowerPoint file didn't contain a Document Record in its PersistPtr blocks. It is probably corrupt.");
} }