From: Nick Burch Date: Mon, 17 Dec 2007 14:19:19 +0000 (+0000) Subject: Avoid a rare ArrayIndexOutOfBoundsException on some word table stuff (patch from... X-Git-Tag: REL_3_0_3_BETA1~250 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e5f8b9951cc8bb20bb87d7abdcd74c4148cc27d8;p=poi.git Avoid a rare ArrayIndexOutOfBoundsException on some word table stuff (patch from bug #44078) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@604878 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java b/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java index 87547565f2..f8fc91f123 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java @@ -148,8 +148,10 @@ public class TableSprmUncompressor for (int x = 0; x < itcMac; x++) { - if(hasTCs) rgtc[x] = TableCellDescriptor.convertBytesToTC(grpprl, - offset + (1 + ( (itcMac + 1) * 2) + (x * 20))); + // Sometimes, the grpprl does not contain data at every offset. I have no idea why this happens. + if(hasTCs && offset + (1 + ( (itcMac + 1) * 2) + (x * 20)) < grpprl.length) + rgtc[x] = TableCellDescriptor.convertBytesToTC(grpprl, + offset + (1 + ( (itcMac + 1) * 2) + (x * 20))); else rgtc[x] = new TableCellDescriptor(); } diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/AIOOB-Tap.doc b/src/scratchpad/testcases/org/apache/poi/hwpf/data/AIOOB-Tap.doc new file mode 100644 index 0000000000..bfd5906caa Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hwpf/data/AIOOB-Tap.doc differ diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java index 87b9754a62..8e7f47ed96 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java @@ -53,8 +53,25 @@ public class TestProblems extends TestCase { Section s = r.getSection(x); for (int y = 0; y < s.numParagraphs(); y++) { Paragraph paragraph = s.getParagraph(y); - System.out.println(paragraph.getCharacterRun(0).text()); + //System.out.println(paragraph.getCharacterRun(0).text()); } } } + + /** + * AIOOB for TableSprmUncompressor.unCompressTAPOperation + */ + public void testSprmAIOOB() throws Exception { + HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/AIOOB-Tap.doc")); + + Range r = doc.getRange(); + StyleSheet styleSheet = doc.getStyleSheet(); + for (int x = 0; x < r.numSections(); x++) { + Section s = r.getSection(x); + for (int y = 0; y < s.numParagraphs(); y++) { + Paragraph paragraph = s.getParagraph(y); + //System.out.println(paragraph.getCharacterRun(0).text()); + } + } + } }