? jakarta-poi/src/testcases/org/apache/poi/hssf/record/TestObjRecord.java
? jakarta-poi/src/testcases/org/apache/poi/hssf/record/TestSubRecord.java
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
retrieving revision 1.3
diff -u -r1.3 ObjRecord.java
--- 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
retrieving revision 1.3
diff -u -r1.3 SubRecord.java
--- 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;
