I modify the file ListLevel.java.
When parsing some doc files, the _numberText might be below zero (I don't
why) and then cause error, such as

java.lang.NegativeArraySizeException
        at org.apache.poi.hwpf.model.ListLevel.<init>(ListLevel.java:115)
        at
org.apache.poi.hwpf.model.ListFormatOverrideLevel.<init>(ListFormatOverrideL
evel.java:48)
        at org.apache.poi.hwpf.model.ListTables.<init>(ListTables.java:85)
        at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:172)
        .............

So I add some handle about _numberText.



? mypatch.patch
Index: ListLevel.java
===================================================================
RCS file:
/home/cvspublic/jakarta-poi/src/scratchpad/src/org/apache/poi/hwpf/model/Lis
tLevel.java,v
retrieving revision 1.3
diff -u -r1.3 ListLevel.java
--- ListLevel.java      24 Aug 2004 12:53:59 -0000      1.3
+++ ListLevel.java      25 Jan 2005 12:28:49 -0000
@@ -49,7 +49,7 @@
   private short _reserved;
   private byte[] _grpprlPapx;
   private byte[] _grpprlChpx;
-  private char[] _numberText;
+  private char[] _numberText=null;
 
   public ListLevel(int startAt, int numberFormatCode, int alignment,
                    byte[] numberProperties, byte[] entryProperties,
@@ -111,13 +111,18 @@
     System.arraycopy(buf, offset, _grpprlChpx, 0, _cbGrpprlChpx);
     offset += _cbGrpprlChpx;
 
-    int numberTextLength = LittleEndian.getShort(buf, offset);
-    _numberText = new char[numberTextLength];
-    offset += LittleEndian.SHORT_SIZE;
-    for (int x = 0; x < numberTextLength; x++)
-    {
-      _numberText[x] = (char)LittleEndian.getShort(buf, offset);
-      offset += LittleEndian.SHORT_SIZE;
+    int numberTextLength = LittleEndian.getShort(buf, offset); 
+    /* sometimes numberTextLength<0 */
+    /* by derjohng */
+    if (numberTextLength>0)
+    {
+        _numberText = new char[numberTextLength];
+        offset += LittleEndian.SHORT_SIZE;
+        for (int x = 0; x < numberTextLength; x++)
+        {
+          _numberText[x] = (char)LittleEndian.getShort(buf, offset);
+          offset += LittleEndian.SHORT_SIZE;
+        }
     }
 
   }
@@ -230,7 +235,12 @@
   }
   public int getSizeInBytes()
   {
-    return 28 + _cbGrpprlChpx + _cbGrpprlPapx + (_numberText.length *
LittleEndian.SHORT_SIZE) + 2;
+      if (_numberText!=null)
+      {
+            return 28 + _cbGrpprlChpx + _cbGrpprlPapx + (_numberText.length
* LittleEndian.SHORT_SIZE) + 2;
+      } else {
+          return 28 + _cbGrpprlChpx + _cbGrpprlPapx  + 2;
+      }
   }
 
 }
===============================================================
Best regards,
        Der-Johng Sun (derjohng)


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/

Reply via email to