Prevent an array out of bounds exception I noticed in the web logs
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Thu, 4 Mar 2010 21:15:39 +0000 (21:15 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Thu, 4 Mar 2010 21:15:39 +0000 (21:15 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@1238 59b500cc-1b3d-0410-9834-0bbf25fbcc57

core/src/com/google/zxing/pdf417/decoder/BitMatrixParser.java

index 03c12ac..7821483 100644 (file)
@@ -16,6 +16,7 @@
 \r
 package com.google.zxing.pdf417.decoder;\r
 \r
+import com.google.zxing.FormatException;\r
 import com.google.zxing.NotFoundException;\r
 import com.google.zxing.common.BitMatrix;\r
 \r
@@ -58,7 +59,7 @@ final class BitMatrixParser {
    *\r
    * @return an array of codewords.\r
    */\r
-  int[] readCodewords() {\r
+  int[] readCodewords() throws FormatException {\r
     int width = bitMatrix.getDimension();\r
     // TODO should be a rectangular matrix\r
     int height = width;\r
@@ -183,11 +184,16 @@ final class BitMatrixParser {
    * @return the next available index into the codeword array after processing\r
    *         this row.\r
    */\r
-  int processRow(int[] rowCounters, int rowNumber, int rowHeight, int[] codewords, int next) {\r
+  int processRow(int[] rowCounters, int rowNumber, int rowHeight, int[] codewords, int next)\r
+      throws FormatException {\r
     int width = bitMatrix.getDimension();\r
     int columnNumber = 0;\r
     long symbol = 0;\r
     for (int i = 0; i < width; i += MODULES_IN_SYMBOL) {\r
+      // This happens in real life and is almost surely a rare misdecode\r
+      if (i + MODULES_IN_SYMBOL > rowCounters.length) {\r
+        throw FormatException.getFormatInstance();\r
+      }\r
       for (int mask = MODULES_IN_SYMBOL - 1; mask >= 0; mask--) {\r
         if (rowCounters[i + (MODULES_IN_SYMBOL - 1 - mask)] >= rowHeight >>> 1) {\r
           symbol |= 1L << mask;\r