]> source.dussan.org Git - poi.git/commitdiff
Sanity check the length, logging and truncating if too long, to avoid a StringIndexOu...
authorNick Burch <nick@apache.org>
Tue, 25 Jun 2013 15:49:45 +0000 (15:49 +0000)
committerNick Burch <nick@apache.org>
Tue, 25 Jun 2013 15:49:45 +0000 (15:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1496520 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java

index a877da1f24f650fe283cc09163af58e1e20afdef..953b0a25a1524c167fe0a031b2219133e8d9e261 100644 (file)
@@ -273,6 +273,7 @@ public final class StyleTextPropAtom extends RecordAtom
         while(pos < rawContents.length && textHandled < prsize) {
             // First up, fetch the number of characters this applies to
             int textLen = LittleEndian.getInt(rawContents,pos);
+            textLen = checkTextLength(textLen, textHandled, size);
             textHandled += textLen;
             pos += 4;
 
@@ -308,6 +309,7 @@ public final class StyleTextPropAtom extends RecordAtom
         while(pos < rawContents.length && textHandled < chsize) {
             // First up, fetch the number of characters this applies to
             int textLen = LittleEndian.getInt(rawContents,pos);
+            textLen = checkTextLength(textLen, textHandled, size);
             textHandled += textLen;
             pos += 4;
 
@@ -345,6 +347,15 @@ public final class StyleTextPropAtom extends RecordAtom
 
         initialised = true;
     }
+    
+    private int checkTextLength(int readLength, int handledSoFar, int overallSize) {
+        if (readLength + handledSoFar > overallSize + 1) {
+            logger.log(POILogger.WARN, "Style length of " + readLength + " at " + handledSoFar + 
+                    " larger than stated size of " + overallSize + ", truncating");
+            return overallSize + 1 - handledSoFar;
+        }
+        return readLength;
+    }
 
 
     /**