diff options
| author | jmestwa-coder <jmestwa@gmail.com> | 2026-06-16 20:37:21 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-06-16 20:37:21 +0300 |
| commit | 9172a3da2010082a6c134fa5cade5cb133aae60d (patch) | |
| tree | 8b4c83bae27edb6cc65367a50f71c85943319f8a | |
| parent | 9e83371612c717c9bfce8eb2625a7c434ea6a717 (diff) | |
| download | zxing-9172a3da2010082a6c134fa5cade5cb133aae60d.tar.xz | |
guard empty symbol in code39 check digit handling (#2092)
| -rw-r--r-- | core/src/main/java/com/google/zxing/oned/Code39Reader.java | 4 | ||||
| -rw-r--r-- | core/src/test/java/com/google/zxing/oned/Code39ExtendedModeTestCase.java | 18 |
2 files changed, 22 insertions, 0 deletions
diff --git a/core/src/main/java/com/google/zxing/oned/Code39Reader.java b/core/src/main/java/com/google/zxing/oned/Code39Reader.java index ecaf8dcd7..710bc769d 100644 --- a/core/src/main/java/com/google/zxing/oned/Code39Reader.java +++ b/core/src/main/java/com/google/zxing/oned/Code39Reader.java @@ -141,6 +141,10 @@ public final class Code39Reader extends OneDReader { } if (usingCheckDigit) { + if (result.length() == 0) { + // false positive -- a symbol with no payload cannot carry a check digit + throw NotFoundException.getNotFoundInstance(); + } int max = result.length() - 1; int total = 0; for (int i = 0; i < max; i++) { diff --git a/core/src/test/java/com/google/zxing/oned/Code39ExtendedModeTestCase.java b/core/src/test/java/com/google/zxing/oned/Code39ExtendedModeTestCase.java index 2433c781f..f6d9abed5 100644 --- a/core/src/test/java/com/google/zxing/oned/Code39ExtendedModeTestCase.java +++ b/core/src/test/java/com/google/zxing/oned/Code39ExtendedModeTestCase.java @@ -64,6 +64,24 @@ public final class Code39ExtendedModeTestCase extends Assert { } } + @Test + public void testRejectsEmptySymbolWithCheckDigit() throws FormatException, ChecksumException { + // The asterisk (0x094) start/stop pattern as wide/narrow modules. A symbol that is just the + // start and stop asterisks decodes to an empty payload, so there is no character to validate + // as a check digit. It must fail with a ReaderException, not read result.charAt(-1). + String asterisk = "100101101101"; + BitMatrix matrix = BitMatrix.parse("0000" + asterisk + '0' + asterisk + "0000", "1", "0"); + BitArray row = new BitArray(matrix.getWidth()); + matrix.getRow(0, row); + Code39Reader sut = new Code39Reader(true, false); + try { + sut.decodeRow(0, row, null); + fail("Expected NotFoundException for empty check-digit symbol"); + } catch (NotFoundException expected) { + // expected + } + } + private static void doTest(String expectedResult, String encodedResult) throws FormatException, ChecksumException, NotFoundException { Code39Reader sut = new Code39Reader(false, true); |
