]> source.dussan.org Git - poi.git/commitdiff
#58733 - New AIOOBE in getCell while iterating through a table in PPT
authorAndreas Beeker <kiwiwings@apache.org>
Mon, 14 Dec 2015 22:49:04 +0000 (22:49 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Mon, 14 Dec 2015 22:49:04 +0000 (22:49 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1720035 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/sl/usermodel/TableShape.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
test-data/slideshow/bug58733_671884.ppt [new file with mode: 0644]

index 5070cf4052fe07b65f4703c9ae635f1ba4583f18..13c5d0dc5202f58192a56825afbe2f70a8cbd567 100644 (file)
@@ -21,10 +21,29 @@ public interface TableShape<
     S extends Shape<S,P>,\r
     P extends TextParagraph<S,P,?>\r
 > extends Shape<S,P>, PlaceableShape<S,P> {\r
+    /**\r
+     * Return the maximum number of columns.\r
+     * If the table contains merged cells, the number of columns might be less than the maximum.\r
+     *\r
+     * @return the maximum number of column\r
+     */\r
     int getNumberOfColumns();\r
     \r
+    /**\r
+     * Return the number of rows\r
+     *\r
+     * @return the row count\r
+     */\r
     int getNumberOfRows();\r
     \r
+    /**\r
+     * Gets a cell\r
+     *\r
+     * @param row the row index (0-based)\r
+     * @param col the column index (0-based)\r
+     * @return the cell or null if the cell doesn't exists, e.g. when accessing\r
+     *         a merged cell or if the index is out of bounds\r
+     */\r
     TableCell<S,P> getCell(int row, int col);\r
     \r
     /**\r
index d0d474944ae0f2734e1d66881f817b321e2cd1cd..21472d709b7a022c974691b28d1551f715bde3ae 100644 (file)
@@ -55,7 +55,6 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow
     private CTTable _table;\r
     private List<XSLFTableRow> _rows;\r
 \r
-    @SuppressWarnings("deprecation")\r
     /*package*/ XSLFTable(CTGraphicalObjectFrame shape, XSLFSheet sheet){\r
         super(shape, sheet);\r
 \r
@@ -83,7 +82,21 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow
 \r
     @Override\r
     public XSLFTableCell getCell(int row, int col) {\r
-        return getRows().get(row).getCells().get(col);\r
+        List<XSLFTableRow> rows = getRows();\r
+        if (row < 0 || rows.size() <= row) {\r
+            return null;\r
+        }\r
+        XSLFTableRow r = rows.get(row);\r
+        if (r == null) {\r
+            // empty row\r
+            return null;\r
+        }\r
+        List<XSLFTableCell> cells = r.getCells();\r
+        if (col < 0 || cells.size() <= col) {\r
+            return null;\r
+        }\r
+        // cell can be potentially empty ...\r
+        return cells.get(col);\r
     }\r
     \r
     @Internal\r
index 4fe197782e26bdbfec4a7dbd042afa9a27b4cf12..737d2927a2111178f7a2ef3e110f0144b0473153 100644 (file)
@@ -58,7 +58,7 @@ public final class HSLFShapeFactory {
             for (EscherProperty ep : props) {
                 if (ep.getPropertyNumber() == EscherProperties.GROUPSHAPE__TABLEPROPERTIES
                     && ep instanceof EscherSimpleProperty
-                    && ((EscherSimpleProperty)ep).getPropertyValue() == 1) {
+                    && (((EscherSimpleProperty)ep).getPropertyValue() & 1) == 1) {
                     isTable = true;
                     break;
                 }
index 814ffe7455e5f78525955c9f71cfff421dc5e15c..b82bed34a686b05a0e5f34a8657ffd1650f8d011 100644 (file)
@@ -52,6 +52,7 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> {
 
 
     protected HSLFTableCell[][] cells;
+    private int columnCount = -1;
 
     /**
      * Create a new Table of the given number of rows and columns
@@ -114,20 +115,31 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> {
         super(escherRecord, parent);
     }
 
-    /**
-     * Gets a cell
-     *
-     * @param row the row index (0-based)
-     * @param col the column index (0-based)
-     * @return the cell
-     */
+    @Override
     public HSLFTableCell getCell(int row, int col) {
-        return cells[row][col];
+        if (row < 0 || cells.length <= row) {
+            return null;
+        }
+        HSLFTableCell[] r = cells[row];
+        if (r == null || col < 0 || r.length <= col) {
+            // empty row
+            return null;
+        }
+        // cell can be potentially empty ...
+        return r[col];
     }
 
     @Override
     public int getNumberOfColumns() {
-        return cells[0].length;
+        if (columnCount == -1) {
+            // check all rows in case of merged rows
+            for (HSLFTableCell[] hc : cells) {
+                if (hc != null) {
+                    columnCount = Math.max(columnCount, hc.length);
+                }
+            }
+        }
+        return columnCount;
     }
 
     @Override
index 6e11a41b54cb1fecb2127c07d8b23a6a3cbdb0e5..68684bf8d62c0d07c1920c1fe3af17f9fc2eefeb 100644 (file)
@@ -768,6 +768,15 @@ public final class TestBugs {
             ex.close();
         }
     }
+
+    @Test
+    public void bug58733() throws IOException {
+        File sample = HSLFTestDataSamples.getSampleFile("bug58733_671884.ppt");
+        PowerPointExtractor ex = new PowerPointExtractor(sample.getAbsolutePath());
+        assertNotNull(ex.getText());
+        ex.close();
+    }
+
     
     private static HSLFSlideShow open(String fileName) throws IOException {
         File sample = HSLFTestDataSamples.getSampleFile(fileName);
diff --git a/test-data/slideshow/bug58733_671884.ppt b/test-data/slideshow/bug58733_671884.ppt
new file mode 100644 (file)
index 0000000..08c46e0
Binary files /dev/null and b/test-data/slideshow/bug58733_671884.ppt differ