Index: jakarta-poi/src/java/org/apache/poi/hssf/record/ObjRecord.java =================================================================== RCS file: /home/cvspublic/jakarta-poi/src/java/org/apache/poi/hssf/record/ObjRecord.java,v --- jakarta-poi/src/java/org/apache/poi/hssf/record/ObjRecord.java 9 Apr 2004 13:05:20 -0000 1.3 +++ jakarta-poi/src/java/org/apache/poi/hssf/record/ObjRecord.java 26 Jun 2004 02:06:10 -0000 @@ -97,8 +97,8 @@ short subRecordSid = LittleEndian.getShort(data, pos); short subRecordSize = LittleEndian.getShort(data, pos + 2); Record subRecord = SubRecord.createSubRecord(subRecordSid, subRecordSize, data, pos + 4); - subrecords.add(subRecord); - pos += 4 + subRecordSize; + subrecords.add( subRecord); + pos += subRecord.getRecordSize(); } } Index: jakarta-poi/src/java/org/apache/poi/hssf/record/SubRecord.java =================================================================== RCS file: /home/cvspublic/jakarta-poi/src/java/org/apache/poi/hssf/record/SubRecord.java,v --- jakarta-poi/src/java/org/apache/poi/hssf/record/SubRecord.java 9 Apr 2004 13:05:20 -0000 1.3 +++ jakarta-poi/src/java/org/apache/poi/hssf/record/SubRecord.java 26 Jun 2004 02:06:10 -0000 @@ -42,19 +42,28 @@ { Record r = null; + short adjustedSize = size; + if( size < 0) { + adjustedSize = 0; + } else if( offset + size > data.length) { + adjustedSize = (short) (data.length - offset); + if( adjustedSize > 4) { + adjustedSize -= 4; + } + } switch ( subRecordSid ) { case CommonObjectDataSubRecord.sid: - r = new CommonObjectDataSubRecord( subRecordSid, size, data, offset ); + r = new CommonObjectDataSubRecord( subRecordSid, adjustedSize, data, offset ); break; case GroupMarkerSubRecord.sid: - r = new GroupMarkerSubRecord( subRecordSid, size, data, offset ); + r = new GroupMarkerSubRecord( subRecordSid, adjustedSize, data, offset ); break; case EndSubRecord.sid: - r = new EndSubRecord( subRecordSid, size, data, offset ); + r = new EndSubRecord( subRecordSid, adjustedSize, data, offset ); break; default: - r = new UnknownRecord( subRecordSid, size, data, offset ); + r = new UnknownRecord( subRecordSid, adjustedSize, data, offset ); } return r;