]> source.dussan.org Git - poi.git/commitdiff
Bug 60906 -- clean up, and add range checking for casting to ints.
authorTim Allison <tallison@apache.org>
Thu, 23 Mar 2017 18:08:52 +0000 (18:08 +0000)
committerTim Allison <tallison@apache.org>
Thu, 23 Mar 2017 18:08:52 +0000 (18:08 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1788295 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/binary/XSSFBCellHeader.java
src/ooxml/java/org/apache/poi/xssf/binary/XSSFBSharedStringsTable.java
src/ooxml/java/org/apache/poi/xssf/binary/XSSFBSheetHandler.java

index 771920975f06ed3bdd82221ca661720829e20428..46d44bdc4790c4f97fcf63679d2f17d1cfd378b0 100644 (file)
@@ -39,11 +39,11 @@ class XSSFBCellHeader {
      * @param cell cell buffer to update
      */
     public static void parse(byte[] data, int offset,  int currentRow, XSSFBCellHeader cell) {
-        long colNum = LittleEndian.getUInt(data, offset); offset += LittleEndian.INT_SIZE;
+        int colNum = XSSFBUtils.castToInt(LittleEndian.getUInt(data, offset)); offset += LittleEndian.INT_SIZE;
         int styleIdx = XSSFBUtils.get24BitInt(data, offset); offset += 3;
         //TODO: range checking
         boolean showPhonetic = false;//TODO: fill this out
-        cell.reset(currentRow, (int)colNum, styleIdx, showPhonetic);
+        cell.reset(currentRow, colNum, styleIdx, showPhonetic);
     }
 
     private int rowNum;
index 474cc4b15a8adcc46ef7982fa4cb69cd02712dd8..2dc197841634e299310c3c2a602f417657d592c1 100644 (file)
@@ -133,8 +133,8 @@ public class XSSFBSharedStringsTable {
                     strings.add(rstr.getString());
                     break;
                 case BrtBeginSst:
-                    count = (int) LittleEndian.getUInt(data,0);
-                    uniqueCount = (int) LittleEndian.getUInt(data, 4);
+                    count = XSSFBUtils.castToInt(LittleEndian.getUInt(data,0));
+                    uniqueCount = XSSFBUtils.castToInt(LittleEndian.getUInt(data, 4));
                     break;
             }
 
index 5fd6d24e586e057513648bb19d99e06e5000f87c..def489f12c88486d9ff1efa301bf6b03eda6f1e6 100644 (file)
@@ -74,11 +74,11 @@ public class XSSFBSheetHandler extends XSSFBParser {
 
         switch(type) {
             case BrtRowHdr:
-                long rw = LittleEndian.getUInt(data, 0);
-                if (rw > 0x00100000L) {//could make sure this is larger than currentRow, according to spec?
+                int rw = XSSFBUtils.castToInt(LittleEndian.getUInt(data, 0));
+                if (rw > 0x00100000) {//could make sure this is larger than currentRow, according to spec?
                     throw new XSSFBParseException("Row number beyond allowable range: "+rw);
                 }
-                currentRow = (int)rw;
+                currentRow = rw;
                 checkMissedComments(currentRow);
                 startRow(currentRow);
                 break;
@@ -142,9 +142,7 @@ public class XSSFBSheetHandler extends XSSFBParser {
         beforeCellValue(data);
         //xNum
         double val = LittleEndian.getDouble(data, XSSFBCellHeader.length);
-        String formatString = styles.getNumberFormatString(cellBuffer.getStyleIdx());
-        String formattedVal = dataFormatter.formatRawCellContents(val, cellBuffer.getStyleIdx(), formatString);
-        handleCellValue(formattedVal);
+        handleCellValue(formatVal(val, cellBuffer.getStyleIdx()));
     }
 
     private void handleCellSt(byte[] data) {
@@ -183,26 +181,25 @@ public class XSSFBSheetHandler extends XSSFBParser {
         beforeCellValue(data);
         //xNum
         double val = LittleEndian.getDouble(data, XSSFBCellHeader.length);
-        String formatString = styles.getNumberFormatString(cellBuffer.getStyleIdx());
-        String formattedVal = dataFormatter.formatRawCellContents(val, cellBuffer.getStyleIdx(), formatString);
-        handleCellValue(formattedVal);
+        handleCellValue(formatVal(val, cellBuffer.getStyleIdx()));
     }
 
     private void handleCellRk(byte[] data) {
         beforeCellValue(data);
         double val = rkNumber(data, XSSFBCellHeader.length);
-        String formatString = styles.getNumberFormatString(cellBuffer.getStyleIdx());
-        short styleIndex = styles.getNumberFormatIndex(cellBuffer.getStyleIdx());
-        String formattedVal = dataFormatter.formatRawCellContents(val, styleIndex, formatString);
-        handleCellValue(formattedVal);
+        handleCellValue(formatVal(val, cellBuffer.getStyleIdx()));
+    }
+
+    private String formatVal(double val, int styleIdx) {
+        String formatString = styles.getNumberFormatString(styleIdx);
+        short styleIndex = styles.getNumberFormatIndex(styleIdx);
+        return dataFormatter.formatRawCellContents(val, styleIndex, formatString);
     }
 
     private void handleBrtCellIsst(byte[] data) {
         beforeCellValue(data);
-        long idx = LittleEndian.getUInt(data, XSSFBCellHeader.length);
-        //check for out of range, buffer overflow
-
-        XSSFRichTextString rtss = new XSSFRichTextString(stringsTable.getEntryAt((int)idx));
+        int idx = XSSFBUtils.castToInt(LittleEndian.getUInt(data, XSSFBCellHeader.length));
+        XSSFRichTextString rtss = new XSSFRichTextString(stringsTable.getEntryAt(idx));
         handleCellValue(rtss.getString());
     }