summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmestwa-coder <jmestwa@gmail.com>2026-06-16 20:37:21 +0300
committerGitHub <noreply@github.com>2026-06-16 20:37:21 +0300
commit9172a3da2010082a6c134fa5cade5cb133aae60d (patch)
tree8b4c83bae27edb6cc65367a50f71c85943319f8a
parent9e83371612c717c9bfce8eb2625a7c434ea6a717 (diff)
downloadzxing-9172a3da2010082a6c134fa5cade5cb133aae60d.tar.xz
guard empty symbol in code39 check digit handling (#2092)
-rw-r--r--core/src/main/java/com/google/zxing/oned/Code39Reader.java4
-rw-r--r--core/src/test/java/com/google/zxing/oned/Code39ExtendedModeTestCase.java18
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);