From 7c4a538248d66d52a8ca4b9e37b55df291746c25 Mon Sep 17 00:00:00 2001 From: gitlost Date: Thu, 23 Nov 2023 16:31:44 +0000 Subject: [PATCH] AZTEC: fix out-of-bounds crash when user-specified size given, ticket #300, props Andre Maute; fix 4-layer compact block max (76 -> 64); fix encoding of byte-blocks > 11-bit limit library: fix 21-bit Unicode conversion in `escape_char_process()`; fix restricting escaped data length by using de-escaped length to check (`escape_char_process()` adapted to do length only calc also) --- ChangeLog | 5 + backend/aztec.c | 119 +++---- backend/aztec.h | 6 +- backend/library.c | 171 ++++++---- backend/tests/test_aztec.c | 397 ++++++++++++++++++++-- backend/tests/test_library.c | 110 ++++-- backend/tests/test_pdf417.c | 2 +- backend/tests/testcommon.c | 9 +- backend/tests/tools/run_zxingcpp_tests.sh | 2 + 9 files changed, 640 insertions(+), 181 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30bfea73..c3a3015e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -113,6 +113,11 @@ Bugs - EAN-2/EAN-5: fix `BARCODE_BIND_TOP/BIND/BOX` output - PDF417: fix out-of-bounds crash in `pdf_text_submode_length()`, ticket #300, props Andre Maute +- AZTEC: fix out-of-bounds crash when user-specified size given, ticket #300, + props Andre Maute; fix 4-layer compact block max (76 -> 64); fix encoding of + byte-blocks > 11-bit limit +- library: fix 21-bit Unicode conversion in `escape_char_process()`; fix + restricting escaped data length by using de-escaped length to check Version 2.12.0 (2022-12-12) diff --git a/backend/aztec.c b/backend/aztec.c index e2f3271d..7541e647 100644 --- a/backend/aztec.c +++ b/backend/aztec.c @@ -104,7 +104,6 @@ static int aztec_text_process(const unsigned char source[], int src_len, int bp, int count; char next_mode; int reduced_length; - int byte_mode = 0; char *encode_mode = (char *) z_alloca(src_len + 1); unsigned char *reduced_source = (unsigned char *) z_alloca(src_len + 1); char *reduced_encode_mode = (char *) z_alloca(src_len + 1); @@ -497,11 +496,7 @@ static int aztec_text_process(const unsigned char source[], int src_len, int bp, current_mode = initial_mode; for (i = 0; i < reduced_length; i++) { - if (reduced_encode_mode[i] != 'B') { - byte_mode = 0; - } - - if ((reduced_encode_mode[i] != current_mode) && (!byte_mode)) { + if (reduced_encode_mode[i] != current_mode) { /* Change mode */ if (current_mode == 'U') { switch (reduced_encode_mode[i]) { @@ -628,27 +623,43 @@ static int aztec_text_process(const unsigned char source[], int src_len, int bp, } } - /* Byte mode length descriptor */ - if ((reduced_encode_mode[i] == 'B') && (!byte_mode)) { + /* Byte mode - process full block here */ + if (reduced_encode_mode[i] == 'B') { + int big_batch = 0; for (count = 0; ((i + count) < reduced_length) && (reduced_encode_mode[i + count] == 'B'); count++); - if (count > 2079) { - return 0; - } + assert(count <= 2047 + 2078); /* Can't be more than 19968 / 8 = 2496 */ - if (count > 31) { + if (count > 2047) { /* Max 11-bit number */ + big_batch = count > 2078 ? 2078 : count; /* Put 00000 followed by 11-bit number of bytes less 31 */ - if (!(bp = az_bin_append_posn(0, 5, binary_string, bp))) return 0; - if (!(bp = az_bin_append_posn(count - 31, 11, binary_string, bp))) return 0; - } else { - /* Put 5-bit number of bytes */ - if (!(bp = az_bin_append_posn(count, 5, binary_string, bp))) return 0; + if (!(bp = az_bin_append_posn(big_batch - 31, 16, binary_string, bp))) return 0; + for (j = 0; j < big_batch; j++) { + if (!(bp = az_bin_append_posn(reduced_source[i++], 8, binary_string, bp))) return 0; + } + count -= big_batch; } - byte_mode = 1; + if (count) { + if (big_batch) { + if (!(bp = az_bin_append_posn(31, 5, binary_string, bp))) return 0; /* B/S */ + } + if (count > 31) { + assert(count <= 2078); + /* Put 00000 followed by 11-bit number of bytes less 31 */ + if (!(bp = az_bin_append_posn(count - 31, 16, binary_string, bp))) return 0; + } else { + /* Put 5-bit number of bytes */ + if (!(bp = az_bin_append_posn(count, 5, binary_string, bp))) return 0; + } + for (j = 0; j < count; j++) { + if (!(bp = az_bin_append_posn(reduced_source[i++], 8, binary_string, bp))) return 0; + } + } + i--; + continue; } - if ((reduced_encode_mode[i] != 'B') && (reduced_encode_mode[i] != 'u') - && (reduced_encode_mode[i] != 'p')) { + if ((reduced_encode_mode[i] != 'u') && (reduced_encode_mode[i] != 'p')) { current_mode = reduced_encode_mode[i]; } } @@ -709,8 +720,6 @@ static int aztec_text_process(const unsigned char source[], int src_len, int bp, if (!(bp = az_bin_append_posn(AztecSymbolChar[(int) reduced_source[i]], 4, binary_string, bp))) return 0; } - } else if (reduced_encode_mode[i] == 'B') { - if (!(bp = az_bin_append_posn(reduced_source[i], 8, binary_string, bp))) return 0; } } @@ -1064,17 +1073,7 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int if (count == codeword_size) { adjusted_string[adjusted_length - 1] = '0'; } - - if (debug_print) { - fputs("Codewords:\n", stdout); - for (i = 0; i < (adjusted_length / codeword_size); i++) { - for (j = 0; j < codeword_size; j++) { - printf("%c", adjusted_string[(i * codeword_size) + j]); - } - fputc(' ', stdout); - } - fputc('\n', stdout); - } + if (debug_print) printf("Adjusted Length: %d, Data Max Size %d\n", adjusted_length, data_maxsize); } while (adjusted_length > data_maxsize); /* This loop will only repeat on the rare occasions when the rule about not having all 1s or all 0s @@ -1117,8 +1116,11 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int if (count == 0 || count == (codeword_size - 1)) { /* Codeword of B-1 '0's or B-1 '1's */ - adjusted_string[j] = count == 0 ? '1' : '0'; - j++; + if (j + 1 >= AZTEC_MAX_CAPACITY) { + strcpy(symbol->errtxt, "704: Data too long for specified Aztec Code symbol size"); + return ZINT_ERROR_TOO_LONG; + } + adjusted_string[j++] = count == 0 ? '1' : '0'; count = binary_string[i] == '1' ? 1 : 0; } else { count = 0; @@ -1127,9 +1129,7 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int } else if (binary_string[i] == '1') { /* Skip B so only counting B-1 */ count++; } - - adjusted_string[j] = binary_string[i]; - j++; + adjusted_string[j++] = binary_string[i]; } adjusted_length = j; @@ -1141,6 +1141,18 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int } if (debug_print) printf("Remainder: %d Pad bits: %d\n", remainder, padbits); + /* Check if the data actually fits into the selected symbol size */ + if (compact) { + data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3); + } else { + data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3); + } + + if (adjusted_length + padbits > data_maxsize) { + strcpy(symbol->errtxt, "505: Data too long for specified Aztec Code symbol size"); + return ZINT_ERROR_TOO_LONG; + } + for (i = 0; i < padbits; i++) { adjusted_string[adjusted_length++] = '1'; } @@ -1155,26 +1167,15 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int adjusted_string[adjusted_length - 1] = '0'; } - /* Check if the data actually fits into the selected symbol size */ - if (compact) { - data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3); - } else { - data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3); - } + if (debug_print) printf("Adjusted Length: %d\n", adjusted_length); + } - if (adjusted_length > data_maxsize) { - strcpy(symbol->errtxt, "505: Data too long for specified Aztec Code symbol size"); - return ZINT_ERROR_TOO_LONG; + if (debug_print) { + printf("Codewords (%d):\n", adjusted_length / codeword_size); + for (i = 0; i < (adjusted_length / codeword_size); i++) { + printf(" %.*s", codeword_size, adjusted_string + i * codeword_size); } - - if (debug_print) { - fputs("Codewords:\n", stdout); - for (i = 0; i < (adjusted_length / codeword_size); i++) { - printf("%.*s ", codeword_size, adjusted_string + i * codeword_size); - } - fputc('\n', stdout); - } - + fputc('\n', stdout); } if (reader && (layers > 22)) { @@ -1186,14 +1187,16 @@ INTERNAL int aztec(struct zint_symbol *symbol, struct zint_seg segs[], const int if (compact) { ecc_blocks = AztecCompactSizes[layers - 1] - data_blocks; + if (layers == 4) { /* Can use spare blocks for ECC (76 available - 64 max data blocks) */ + ecc_blocks += 12; + } } else { ecc_blocks = AztecSizes[layers - 1] - data_blocks; } if (debug_print) { printf("Generating a %s symbol with %d layers\n", compact ? "compact" : "full-size", layers); - printf("Requires %d", compact ? AztecCompactSizes[layers - 1] : AztecSizes[layers - 1]); - printf(" codewords of %d-bits\n", codeword_size); + printf("Requires %d codewords of %d-bits\n", data_blocks + ecc_blocks, codeword_size); printf(" (%d data words, %d ecc words)\n", data_blocks, ecc_blocks); } diff --git a/backend/aztec.h b/backend/aztec.h index e9ea564d..70fc9487 100644 --- a/backend/aztec.h +++ b/backend/aztec.h @@ -1,7 +1,7 @@ /* aztec.h - Handles Aztec 2D Symbols */ /* libzint - the open source barcode library - Copyright (C) 2008-2022 Robin Stuart + Copyright (C) 2008-2023 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -104,7 +104,7 @@ static const short AztecSizes[32] = { }; static const short AztecCompactSizes[4] = { - 17, 40, 51, 76 + 17, 40, 51, 64 /* 64 data blocks (Mode Message max) but 76 altogether */ }; static const short Aztec10DataSizes[32] = { @@ -136,7 +136,7 @@ static const short Aztec50DataSizes[32] = { }; static const short AztecCompact10DataSizes[4] = { - 78, 198, 336, 520 + 78, 198, 336, 512 /* Max 64 * 8 */ }; static const short AztecCompact23DataSizes[4] = { diff --git a/backend/library.c b/backend/library.c index 9960a455..e8cfddf6 100644 --- a/backend/library.c +++ b/backend/library.c @@ -706,20 +706,17 @@ static int esc_base(struct zint_symbol *symbol, unsigned char *input_string, int return -1; } -/* Helper to parse escape sequences */ -static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_string, int *p_length) { +/* Helper to parse escape sequences. If `escaped_string` NULL, calculates length only */ +static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_string, int *p_length, + unsigned char *escaped_string) { const int length = *p_length; - int in_posn, out_posn; + int in_posn = 0, out_posn = 0; int ch; int val; int i; unsigned long unicode; - unsigned char *escaped_string = (unsigned char *) z_alloca(length + 1); const int extra_escape_mode = (symbol->input_mode & EXTRA_ESCAPE_MODE) && symbol->symbology == BARCODE_CODE128; - in_posn = 0; - out_posn = 0; - do { if (input_string[in_posn] == '\\') { if (in_posn + 1 >= length) { @@ -729,7 +726,8 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ ch = input_string[in_posn + 1]; /* NOTE: if add escape character, must also update regex in "frontend_qt/datawindow.php" */ switch (ch) { - case '0': escaped_string[out_posn] = 0x00; /* Null */ + case '0': + if (escaped_string) escaped_string[out_posn] = 0x00; /* Null */ in_posn += 2; break; case '^': /* CODE128 specific */ @@ -738,44 +736,64 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ return ZINT_ERROR_INVALID_DATA; } /* Pass thru unaltered */ - escaped_string[out_posn++] = '\\'; - escaped_string[out_posn] = '^'; + if (escaped_string) { + escaped_string[out_posn++] = '\\'; + escaped_string[out_posn] = '^'; + } else { + out_posn++; + } in_posn += 2; if (in_posn < length) { /* Note allowing '\\^' on its own at end */ - escaped_string[++out_posn] = input_string[in_posn++]; + if (escaped_string) { + escaped_string[++out_posn] = input_string[in_posn++]; + } else { + ++out_posn; + in_posn++; + } } break; - case 'E': escaped_string[out_posn] = 0x04; /* End of Transmission */ + case 'E': + if (escaped_string) escaped_string[out_posn] = 0x04; /* End of Transmission */ in_posn += 2; break; - case 'a': escaped_string[out_posn] = 0x07; /* Bell */ + case 'a': + if (escaped_string) escaped_string[out_posn] = 0x07; /* Bell */ in_posn += 2; break; - case 'b': escaped_string[out_posn] = 0x08; /* Backspace */ + case 'b': + if (escaped_string) escaped_string[out_posn] = 0x08; /* Backspace */ in_posn += 2; break; - case 't': escaped_string[out_posn] = 0x09; /* Horizontal tab */ + case 't': + if (escaped_string) escaped_string[out_posn] = 0x09; /* Horizontal tab */ in_posn += 2; break; - case 'n': escaped_string[out_posn] = 0x0a; /* Line feed */ + case 'n': + if (escaped_string) escaped_string[out_posn] = 0x0a; /* Line feed */ in_posn += 2; break; - case 'v': escaped_string[out_posn] = 0x0b; /* Vertical tab */ + case 'v': + if (escaped_string) escaped_string[out_posn] = 0x0b; /* Vertical tab */ in_posn += 2; break; - case 'f': escaped_string[out_posn] = 0x0c; /* Form feed */ + case 'f': + if (escaped_string) escaped_string[out_posn] = 0x0c; /* Form feed */ in_posn += 2; break; - case 'r': escaped_string[out_posn] = 0x0d; /* Carriage return */ + case 'r': + if (escaped_string) escaped_string[out_posn] = 0x0d; /* Carriage return */ in_posn += 2; break; - case 'e': escaped_string[out_posn] = 0x1b; /* Escape */ + case 'e': + if (escaped_string) escaped_string[out_posn] = 0x1b; /* Escape */ in_posn += 2; break; - case 'G': escaped_string[out_posn] = 0x1d; /* Group Separator */ + case 'G': + if (escaped_string) escaped_string[out_posn] = 0x1d; /* Group Separator */ in_posn += 2; break; - case 'R': escaped_string[out_posn] = 0x1e; /* Record Separator */ + case 'R': + if (escaped_string) escaped_string[out_posn] = 0x1e; /* Record Separator */ in_posn += 2; break; case 'd': @@ -784,10 +802,11 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ if ((val = esc_base(symbol, input_string, length, in_posn + 2, ch)) == -1) { return ZINT_ERROR_INVALID_DATA; } - escaped_string[out_posn] = val; + if (escaped_string) escaped_string[out_posn] = val; in_posn += 4 + (ch != 'x'); break; - case '\\': escaped_string[out_posn] = '\\'; + case '\\': + if (escaped_string) escaped_string[out_posn] = '\\'; in_posn += 2; break; case 'u': @@ -814,46 +833,59 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_ sprintf(symbol->errtxt, "246: Invalid value for '\\%c' escape sequence in input data", ch); return ZINT_ERROR_INVALID_DATA; } - if (unicode >= 0x800) { - if (unicode >= 0x10000) { - escaped_string[out_posn] = 0xf0 + (unsigned char) (unicode >> 16); + if (unicode < 0x80) { + if (escaped_string) escaped_string[out_posn] = (unsigned char) unicode; + } else if (unicode < 0x800) { + if (escaped_string) { + escaped_string[out_posn++] = (unsigned char) (0xC0 | (unicode >> 6)); + escaped_string[out_posn] = (unsigned char) (0x80 | (unicode & 0x3F)); + } else { out_posn++; } - escaped_string[out_posn] = 0xe0 + ((unicode & 0xf000) >> 12); - out_posn++; - escaped_string[out_posn] = 0x80 + ((unicode & 0x0fc0) >> 6); - out_posn++; - escaped_string[out_posn] = 0x80 + (unicode & 0x003f); - } else if (unicode >= 0x80) { - escaped_string[out_posn] = 0xc0 + ((unicode & 0x07c0) >> 6); - out_posn++; - escaped_string[out_posn] = 0x80 + (unicode & 0x003f); + } else if (unicode < 0x10000) { + if (escaped_string) { + escaped_string[out_posn++] = (unsigned char) (0xE0 | (unicode >> 12)); + escaped_string[out_posn++] = (unsigned char) (0x80 | ((unicode >> 6) & 0x3F)); + escaped_string[out_posn] = (unsigned char) (0x80 | (unicode & 0x3F)); + } else { + out_posn += 2; + } } else { - escaped_string[out_posn] = unicode & 0x7f; + if (escaped_string) { + escaped_string[out_posn++] = (unsigned char) (0xF0 | (unicode >> 18)); + escaped_string[out_posn++] = (unsigned char) (0x80 | ((unicode >> 12) & 0x3F)); + escaped_string[out_posn++] = (unsigned char) (0x80 | ((unicode >> 6) & 0x3F)); + escaped_string[out_posn] = (unsigned char) (0x80 | (unicode & 0x3F)); + } else { + out_posn += 3; + } } in_posn += 6 + (ch == 'U') * 2; break; - default: sprintf(symbol->errtxt, "234: Unrecognised escape character '\\%c' in input data", ch); + default: + sprintf(symbol->errtxt, "234: Unrecognised escape character '\\%c' in input data", ch); return ZINT_ERROR_INVALID_DATA; break; } } else { - escaped_string[out_posn] = input_string[in_posn]; + if (escaped_string) escaped_string[out_posn] = input_string[in_posn]; in_posn++; } out_posn++; } while (in_posn < length); - memcpy(input_string, escaped_string, out_posn); - input_string[out_posn] = '\0'; + if (escaped_string) { + escaped_string[out_posn] = '\0'; + } *p_length = out_posn; return 0; } -#ifdef ZINT_TEST /* Wrapper for direct testing */ -INTERNAL int escape_char_process_test(struct zint_symbol *symbol, unsigned char *input_string, int *length) { - return escape_char_process(symbol, input_string, length); +#ifdef ZINT_TEST /* Wrapper for direct testing (also used by `testUtilZXingCPPCmp()` in "tests/testcommon.c") */ +INTERNAL int escape_char_process_test(struct zint_symbol *symbol, unsigned char *input_string, int *p_length, + unsigned char *escaped_string) { + return escape_char_process(symbol, input_string, p_length, escaped_string); } #endif @@ -920,10 +952,22 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[ } return error_tag(symbol, ZINT_ERROR_INVALID_DATA, NULL); } - if (local_segs[i].length > ZINT_MAX_DATA_LEN) { - return error_tag(symbol, ZINT_ERROR_TOO_LONG, "777: Input data too long"); + if (symbol->input_mode & ESCAPE_MODE) { /* Calculate de-escaped length for check against ZINT_MAX_DATA_LEN */ + int escaped_len = local_segs[i].length; + error_number = escape_char_process(symbol, local_segs[i].source, &escaped_len, NULL /*escaped_string*/); + if (error_number != 0) { /* Only returns errors, not warnings */ + return error_tag(symbol, error_number, NULL); + } + if (escaped_len > ZINT_MAX_DATA_LEN) { + return error_tag(symbol, ZINT_ERROR_TOO_LONG, "797: Input data too long"); + } + total_len += escaped_len; + } else { + if (local_segs[i].length > ZINT_MAX_DATA_LEN) { + return error_tag(symbol, ZINT_ERROR_TOO_LONG, "777: Input data too long"); + } + total_len += local_segs[i].length; } - total_len += local_segs[i].length; } if (total_len == 0) { @@ -1141,27 +1185,30 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[ local_sources = (unsigned char *) z_alloca(total_len + seg_count); + /* Copy input, de-escaping if required */ for (i = 0, local_source = local_sources; i < seg_count; i++) { local_segs[i].source = local_source; - memcpy(local_segs[i].source, segs[i].source, local_segs[i].length); - local_segs[i].source[local_segs[i].length] = '\0'; + if (symbol->input_mode & ESCAPE_MODE) { + /* Checked already */ + (void) escape_char_process(symbol, segs[i].source, &local_segs[i].length, local_segs[i].source); + } else { + memcpy(local_segs[i].source, segs[i].source, local_segs[i].length); + local_segs[i].source[local_segs[i].length] = '\0'; + } local_source += local_segs[i].length + 1; } - /* Start acting on input mode */ - if (symbol->input_mode & ESCAPE_MODE) { - for (i = 0; i < seg_count; i++) { - error_number = escape_char_process(symbol, local_segs[i].source, &local_segs[i].length); - if (error_number != 0) { /* Only returns errors, not warnings */ - return error_tag(symbol, error_number, NULL); - } + if ((symbol->input_mode & ESCAPE_MODE) && symbol->primary[0] && strchr(symbol->primary, '\\') != NULL) { + char primary[sizeof(symbol->primary)]; + int primary_len = (int) strlen(symbol->primary); + if (primary_len >= (int) sizeof(symbol->primary)) { + return error_tag(symbol, ZINT_ERROR_INVALID_DATA, "799: Invalid primary string"); } - if (symbol->primary[0]) { - int primary_len = (int) strlen(symbol->primary); - error_number = escape_char_process(symbol, (unsigned char *) symbol->primary, &primary_len); - if (error_number != 0) { /* Only returns errors, not warnings */ - return error_tag(symbol, error_number, NULL); - } + ustrcpy(primary, symbol->primary); + error_number = escape_char_process(symbol, (unsigned char *) primary, &primary_len, + (unsigned char *) symbol->primary); + if (error_number != 0) { /* Only returns errors, not warnings */ + return error_tag(symbol, error_number, NULL); } } diff --git a/backend/tests/test_aztec.c b/backend/tests/test_aztec.c index 4cb340bf..b3df9744 100644 --- a/backend/tests/test_aztec.c +++ b/backend/tests/test_aztec.c @@ -31,6 +31,194 @@ #include "testcommon.h" +static void test_large(const testCtx *const p_ctx) { + int debug = p_ctx->debug; + + struct item { + int symbology; + int eci; + int option_1; + int option_2; + int output_options; + struct zint_structapp structapp; + char *pattern; + int length; + int ret; + int expected_rows; + int expected_width; + const char *ret_errtxt; + }; + /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */ + struct item data[] = { + /* 0*/ { BARCODE_AZTEC, -1, 1, -1, -1, { 0, 0, "" }, "\xFF", 2053, 0, 151, 151, "" }, + /* 1*/ { BARCODE_AZTEC, -1, 1, -1, -1, { 0, 0, "" }, "\xFF", 2054, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 2*/ { BARCODE_AZTEC, -1, 1, -1, -1, { 0, 0, "" }, "\xFF", 2237, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 3*/ { BARCODE_AZTEC, -1, 1, -1, -1, { 0, 0, "" }, "\xFF", 2238, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + /* 4*/ { BARCODE_AZTEC, -1, 2, -1, -1, { 0, 0, "" }, "1", 3835, 0, 151, 151, "" }, + /* 5*/ { BARCODE_AZTEC, -1, 2, -1, -1, { 0, 0, "" }, "1", 3836, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 6*/ { BARCODE_AZTEC, -1, 2, -1, -1, { 0, 0, "" }, "A", 3069, 0, 151, 151, "" }, + /* 7*/ { BARCODE_AZTEC, -1, 2, -1, -1, { 0, 0, "" }, "A", 3070, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 8*/ { BARCODE_AZTEC, -1, 2, -1, -1, { 0, 0, "" }, "\xFF", 1756, 0, 151, 151, "" }, + /* 9*/ { BARCODE_AZTEC, -1, 2, -1, -1, { 0, 0, "" }, "\xFF", 1757, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 10*/ { BARCODE_AZTEC, -1, 3, -1, -1, { 0, 0, "" }, "1", 3184, 0, 151, 151, "" }, + /* 11*/ { BARCODE_AZTEC, -1, 3, -1, -1, { 0, 0, "" }, "1", 3185, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 12*/ { BARCODE_AZTEC, -1, 3, -1, -1, { 0, 0, "" }, "A", 2548, 0, 151, 151, "" }, + /* 13*/ { BARCODE_AZTEC, -1, 3, -1, -1, { 0, 0, "" }, "A", 2549, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 14*/ { BARCODE_AZTEC, -1, 3, -1, -1, { 0, 0, "" }, "\xFF", 1457, 0, 151, 151, "" }, + /* 15*/ { BARCODE_AZTEC, -1, 3, -1, -1, { 0, 0, "" }, "\xFF", 1458, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 16*/ { BARCODE_AZTEC, -1, 4, -1, -1, { 0, 0, "" }, "1", 2485, 0, 151, 151, "" }, + /* 17*/ { BARCODE_AZTEC, -1, 4, -1, -1, { 0, 0, "" }, "1", 2486, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 18*/ { BARCODE_AZTEC, -1, 4, -1, -1, { 0, 0, "" }, "A", 1989, 0, 151, 151, "" }, + /* 19*/ { BARCODE_AZTEC, -1, 4, -1, -1, { 0, 0, "" }, "A", 1990, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 20*/ { BARCODE_AZTEC, -1, 4, -1, -1, { 0, 0, "" }, "\xFF", 1137, 0, 151, 151, "" }, + /* 21*/ { BARCODE_AZTEC, -1, 4, -1, -1, { 0, 0, "" }, "\xFF", 1138, ZINT_ERROR_TOO_LONG, -1, -1, "Error 504: Input too long (too many bits for selected ECC)" }, + /* 22*/ { BARCODE_AZTEC, -1, -1, 1, -1, { 0, 0, "" }, "\xFF", 7, 0, 15, 15, "" }, + /* 23*/ { BARCODE_AZTEC, -1, -1, 1, -1, { 0, 0, "" }, "\xFF", 8, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 24*/ { BARCODE_AZTEC, -1, -1, 1, -1, { 0, 0, "" }, "\xFF", 2078, ZINT_ERROR_TOO_LONG, -1, -1, "Error 704: Data too long for specified Aztec Code symbol size" }, + /* 25*/ { BARCODE_AZTEC, -1, -1, 2, -1, { 0, 0, "" }, "\xFF", 22, 0, 19, 19, "" }, + /* 26*/ { BARCODE_AZTEC, -1, -1, 2, -1, { 0, 0, "" }, "\xFF", 23, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 27*/ { BARCODE_AZTEC, -1, -1, 2, -1, { 0, 0, "" }, "\xFF", 2077, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 28*/ { BARCODE_AZTEC, -1, -1, 2, -1, { 0, 0, "" }, "\xFF", 2078, ZINT_ERROR_TOO_LONG, -1, -1, "Error 704: Data too long for specified Aztec Code symbol size" }, + /* 29*/ { BARCODE_AZTEC, -1, -1, 3, -1, { 0, 0, "" }, "\xFF", 39, 0, 23, 23, "" }, + /* 30*/ { BARCODE_AZTEC, -1, -1, 3, -1, { 0, 0, "" }, "\xFF", 40, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 31*/ { BARCODE_AZTEC, -1, -1, 4, -1, { 0, 0, "" }, "\xFF", 51, 0, 27, 27, "" }, + /* 32*/ { BARCODE_AZTEC, -1, -1, 4, -1, { 0, 0, "" }, "\xFF", 52, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 33*/ { BARCODE_AZTEC, -1, -1, 5, -1, { 0, 0, "" }, "\xFF", 10, 0, 19, 19, "" }, + /* 34*/ { BARCODE_AZTEC, -1, -1, 5, -1, { 0, 0, "" }, "\xFF", 11, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 35*/ { BARCODE_AZTEC, -1, -1, 5, -1, { 0, 0, "" }, "\xFF", 2077, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 36*/ { BARCODE_AZTEC, -1, -1, 5, -1, { 0, 0, "" }, "\xFF", 2078, ZINT_ERROR_TOO_LONG, -1, -1, "Error 704: Data too long for specified Aztec Code symbol size" }, + /* 37*/ { BARCODE_AZTEC, -1, -1, 6, -1, { 0, 0, "" }, "\xFF", 27, 0, 23, 23, "" }, + /* 38*/ { BARCODE_AZTEC, -1, -1, 6, -1, { 0, 0, "" }, "\xFF", 28, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 39*/ { BARCODE_AZTEC, -1, -1, 7, -1, { 0, 0, "" }, "\xFF", 47, 0, 27, 27, "" }, + /* 40*/ { BARCODE_AZTEC, -1, -1, 7, -1, { 0, 0, "" }, "\xFF", 48, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 41*/ { BARCODE_AZTEC, -1, -1, 8, -1, { 0, 0, "" }, "\xFF", 72, 0, 31, 31, "" }, + /* 42*/ { BARCODE_AZTEC, -1, -1, 8, -1, { 0, 0, "" }, "\xFF", 73, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 43*/ { BARCODE_AZTEC, -1, -1, 9, -1, { 0, 0, "" }, "\xFF", 100, 0, 37, 37, "" }, + /* 44*/ { BARCODE_AZTEC, -1, -1, 9, -1, { 0, 0, "" }, "\xFF", 101, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 45*/ { BARCODE_AZTEC, -1, -1, 10, -1, { 0, 0, "" }, "\xFF", 131, 0, 41, 41, "" }, + /* 46*/ { BARCODE_AZTEC, -1, -1, 10, -1, { 0, 0, "" }, "\xFF", 132, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 47*/ { BARCODE_AZTEC, -1, -1, 11, -1, { 0, 0, "" }, "\xFF", 166, 0, 45, 45, "" }, + /* 48*/ { BARCODE_AZTEC, -1, -1, 11, -1, { 0, 0, "" }, "\xFF", 167, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 49*/ { BARCODE_AZTEC, -1, -1, 12, -1, { 0, 0, "" }, "\xFF", 205, 0, 49, 49, "" }, + /* 50*/ { BARCODE_AZTEC, -1, -1, 12, -1, { 0, 0, "" }, "\xFF", 206, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 51*/ { BARCODE_AZTEC, -1, -1, 13, -1, { 0, 0, "" }, "\xFF", 253, 0, 53, 53, "" }, + /* 52*/ { BARCODE_AZTEC, -1, -1, 13, -1, { 0, 0, "" }, "\xFF", 254, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 53*/ { BARCODE_AZTEC, -1, -1, 14, -1, { 0, 0, "" }, "\xFF", 300, 0, 57, 57, "" }, + /* 54*/ { BARCODE_AZTEC, -1, -1, 14, -1, { 0, 0, "" }, "\xFF", 301, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 55*/ { BARCODE_AZTEC, -1, -1, 15, -1, { 0, 0, "" }, "\xFF", 349, 0, 61, 61, "" }, + /* 56*/ { BARCODE_AZTEC, -1, -1, 15, -1, { 0, 0, "" }, "\xFF", 350, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 57*/ { BARCODE_AZTEC, -1, -1, 16, -1, { 0, 0, "" }, "\xFF", 403, 0, 67, 67, "" }, + /* 58*/ { BARCODE_AZTEC, -1, -1, 16, -1, { 0, 0, "" }, "\xFF", 404, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 59*/ { BARCODE_AZTEC, -1, -1, 17, -1, { 0, 0, "" }, "\xFF", 462, 0, 71, 71, "" }, + /* 60*/ { BARCODE_AZTEC, -1, -1, 17, -1, { 0, 0, "" }, "\xFF", 463, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 61*/ { BARCODE_AZTEC, -1, -1, 18, -1, { 0, 0, "" }, "\xFF", 523, 0, 75, 75, "" }, + /* 62*/ { BARCODE_AZTEC, -1, -1, 18, -1, { 0, 0, "" }, "\xFF", 524, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 63*/ { BARCODE_AZTEC, -1, -1, 19, -1, { 0, 0, "" }, "\xFF", 588, 0, 79, 79, "" }, + /* 64*/ { BARCODE_AZTEC, -1, -1, 19, -1, { 0, 0, "" }, "\xFF", 589, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 65*/ { BARCODE_AZTEC, -1, -1, 20, -1, { 0, 0, "" }, "\xFF", 655, 0, 83, 83, "" }, + /* 66*/ { BARCODE_AZTEC, -1, -1, 20, -1, { 0, 0, "" }, "\xFF", 656, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 67*/ { BARCODE_AZTEC, -1, -1, 21, -1, { 0, 0, "" }, "\xFF", 727, 0, 87, 87, "" }, + /* 68*/ { BARCODE_AZTEC, -1, -1, 21, -1, { 0, 0, "" }, "\xFF", 728, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 69*/ { BARCODE_AZTEC, -1, -1, 22, -1, { 0, 0, "" }, "\xFF", 804, 0, 91, 91, "" }, + /* 70*/ { BARCODE_AZTEC, -1, -1, 22, -1, { 0, 0, "" }, "\xFF", 805, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 71*/ { BARCODE_AZTEC, -1, -1, 23, -1, { 0, 0, "" }, "\xFF", 883, 0, 95, 95, "" }, + /* 72*/ { BARCODE_AZTEC, -1, -1, 23, -1, { 0, 0, "" }, "\xFF", 884, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 73*/ { BARCODE_AZTEC, -1, -1, 24, -1, { 0, 0, "" }, "\xFF", 966, 0, 101, 101, "" }, + /* 74*/ { BARCODE_AZTEC, -1, -1, 24, -1, { 0, 0, "" }, "\xFF", 967, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 75*/ { BARCODE_AZTEC, -1, -1, 25, -1, { 0, 0, "" }, "\xFF", 1051, 0, 105, 105, "" }, + /* 76*/ { BARCODE_AZTEC, -1, -1, 25, -1, { 0, 0, "" }, "\xFF", 1052, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 77*/ { BARCODE_AZTEC, -1, -1, 26, -1, { 0, 0, "" }, "\xFF", 1141, 0, 109, 109, "" }, + /* 78*/ { BARCODE_AZTEC, -1, -1, 26, -1, { 0, 0, "" }, "\xFF", 1142, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 79*/ { BARCODE_AZTEC, -1, -1, 27, -1, { 0, 0, "" }, "\xFF", 1258, 0, 113, 113, "" }, + /* 80*/ { BARCODE_AZTEC, -1, -1, 27, -1, { 0, 0, "" }, "\xFF", 1259, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 81*/ { BARCODE_AZTEC, -1, -1, 28, -1, { 0, 0, "" }, "\xFF", 1357, 0, 117, 117, "" }, + /* 82*/ { BARCODE_AZTEC, -1, -1, 28, -1, { 0, 0, "" }, "\xFF", 1358, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 83*/ { BARCODE_AZTEC, -1, -1, 29, -1, { 0, 0, "" }, "\xFF", 1459, 0, 121, 121, "" }, + /* 84*/ { BARCODE_AZTEC, -1, -1, 29, -1, { 0, 0, "" }, "\xFF", 1460, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 85*/ { BARCODE_AZTEC, -1, -1, 30, -1, { 0, 0, "" }, "\xFF", 1566, 0, 125, 125, "" }, + /* 86*/ { BARCODE_AZTEC, -1, -1, 30, -1, { 0, 0, "" }, "\xFF", 1567, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 87*/ { BARCODE_AZTEC, -1, -1, 31, -1, { 0, 0, "" }, "\xFF", 1676, 0, 131, 131, "" }, + /* 88*/ { BARCODE_AZTEC, -1, -1, 31, -1, { 0, 0, "" }, "\xFF", 1677, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 89*/ { BARCODE_AZTEC, -1, -1, 32, -1, { 0, 0, "" }, "\xFF", 1789, 0, 135, 135, "" }, + /* 90*/ { BARCODE_AZTEC, -1, -1, 32, -1, { 0, 0, "" }, "\xFF", 1790, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 91*/ { BARCODE_AZTEC, -1, -1, 33, -1, { 0, 0, "" }, "\xFF", 1907, 0, 139, 139, "" }, + /* 92*/ { BARCODE_AZTEC, -1, -1, 33, -1, { 0, 0, "" }, "\xFF", 1908, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 93*/ { BARCODE_AZTEC, -1, -1, 34, -1, { 0, 0, "" }, "\xFF", 2028, 0, 143, 143, "" }, + /* 94*/ { BARCODE_AZTEC, -1, -1, 34, -1, { 0, 0, "" }, "\xFF", 2029, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 95*/ { BARCODE_AZTEC, -1, -1, 35, -1, { 0, 0, "" }, "\xFF", 2149, 0, 147, 147, "" }, + /* 96*/ { BARCODE_AZTEC, -1, -1, 35, -1, { 0, 0, "" }, "\xFF", 2150, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /* 97*/ { BARCODE_AZTEC, -1, -1, 36, -1, { 0, 0, "" }, "\xFF", 2237, 0, 151, 151, "" }, + /* 98*/ { BARCODE_AZTEC, -1, -1, 36, -1, { 0, 0, "" }, "\xFF", 2238, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + /* 99*/ { BARCODE_AZTEC, -1, -1, 34, -1, { 0, 0, "" }, "1", 4429, 0, 143, 143, "" }, + /*100*/ { BARCODE_AZTEC, -1, -1, 34, -1, { 0, 0, "" }, "1", 4430, ZINT_ERROR_TOO_LONG, -1, -1, "Error 505: Data too long for specified Aztec Code symbol size" }, + /*101*/ { BARCODE_AZTEC, -1, -1, 35, -1, { 0, 0, "" }, "1", 4483, 0, 147, 147, "" }, + /*102*/ { BARCODE_AZTEC, -1, -1, 35, -1, { 0, 0, "" }, "1", 4484, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + /*103*/ { BARCODE_AZTEC, -1, -1, 36, -1, { 0, 0, "" }, "1", 4483, 0, 151, 151, "" }, + /*104*/ { BARCODE_AZTEC, -1, -1, 36, -1, { 0, 0, "" }, "1", 4484, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + /*105*/ { BARCODE_AZTEC, 899, -1, 36, -1, { 0, 0, "" }, "\xFF", 2234, 0, 151, 151, "" }, + /*106*/ { BARCODE_AZTEC, 899, -1, 36, -1, { 0, 0, "" }, "\xFF", 2235, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + /*107*/ { BARCODE_AZTEC, -1, -1, 36, -1, { 2, 3, "1234567890123456789012" }, "\xFF", 2221, 0, 151, 151, "" }, + /*108*/ { BARCODE_AZTEC, -1, -1, 36, -1, { 2, 3, "1234567890123456789012" }, "\xFF", 2222, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + /*109*/ { BARCODE_AZTEC, 899, -1, 36, -1, { 2, 3, "1234567890123456789012" }, "\xFF", 2218, 0, 151, 151, "" }, + /*110*/ { BARCODE_AZTEC, 899, -1, 36, -1, { 2, 3, "1234567890123456789012" }, "\xFF", 2219, ZINT_ERROR_TOO_LONG, -1, -1, "Error 502: Input too long or too many extended ASCII characters" }, + }; + int data_size = ARRAY_SIZE(data); + int i, length, ret; + struct zint_symbol *symbol = NULL; + + char escaped[8192]; + char cmp_buf[32768]; + char cmp_msg[8192]; + + char data_buf[ZINT_MAX_DATA_LEN]; + + int do_zxingcpp = (debug & ZINT_DEBUG_TEST_ZXINGCPP) && testUtilHaveZXingCPPDecoder(); /* Only do ZXing-C++ test if asked, too slow otherwise */ + + testStartSymbol("test_large", &symbol); + + for (i = 0; i < data_size; i++) { + + if (testContinue(p_ctx, i)) continue; + + symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + testUtilStrCpyRepeat(data_buf, data[i].pattern, data[i].length); + assert_equal(data[i].length, (int) strlen(data_buf), "i:%d length %d != strlen(data_buf) %d\n", i, data[i].length, (int) strlen(data_buf)); + + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, data[i].eci, data[i].option_1, data[i].option_2, -1, data[i].output_options, data_buf, data[i].length, debug); + if (data[i].structapp.count) { + symbol->structapp = data[i].structapp; + } + + ret = ZBarcode_Encode(symbol, (unsigned char *) data_buf, length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (ret < ZINT_ERROR) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width); + + if (do_zxingcpp && testUtilCanZXingCPP(i, symbol, data_buf, length, debug)) { + int cmp_len, ret_len; + char modules_dump[22801 + 1]; + assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, "i:%d testUtilModulesDump == -1\n", i); + ret = testUtilZXingCPP(i, symbol, data_buf, length, modules_dump, cmp_buf, sizeof(cmp_buf), &cmp_len); + assert_zero(ret, "i:%d %s testUtilZXingCPP ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilZXingCPPCmp(symbol, cmp_msg, cmp_buf, cmp_len, data_buf, length, NULL /*primary*/, escaped, &ret_len); + assert_zero(ret, "i:%d %s testUtilZXingCPPCmp %d != 0 %s\n actual: %.*s\nexpected: %.*s\n", + i, testUtilBarcodeName(symbol->symbology), ret, cmp_msg, cmp_len, cmp_buf, ret_len, escaped); + } + } else { + assert_zero(strcmp(symbol->errtxt, data[i].ret_errtxt), "i:%d errtxt %s != %s\n", i, symbol->errtxt, data[i].ret_errtxt); + } + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + static void test_options(const testCtx *const p_ctx) { int debug = p_ctx->debug; @@ -76,9 +264,9 @@ static void test_options(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_options"); + testStartSymbol("test_options", &symbol); for (i = 0; i < data_size; i++) { @@ -2390,7 +2578,7 @@ static void test_encode(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char escaped[1024]; char cmp_buf[32768]; @@ -2399,7 +2587,7 @@ static void test_encode(const testCtx *const p_ctx) { int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); /* Only do BWIPP test if asked, too slow otherwise */ int do_zxingcpp = (debug & ZINT_DEBUG_TEST_ZXINGCPP) && testUtilHaveZXingCPPDecoder(); /* Only do ZXing-C++ test if asked, too slow otherwise */ - testStart("test_encode"); + testStartSymbol("test_encode", &symbol); for (i = 0; i < data_size; i++) { @@ -2656,7 +2844,7 @@ static void test_encode_segs(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, j, seg_count, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char escaped[1024]; char cmp_buf[32768]; @@ -2665,7 +2853,7 @@ static void test_encode_segs(const testCtx *const p_ctx) { int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); /* Only do BWIPP test if asked, too slow otherwise */ int do_zxingcpp = (debug & ZINT_DEBUG_TEST_ZXINGCPP) && testUtilHaveZXingCPPDecoder(); /* Only do ZXing-C++ test if asked, too slow otherwise */ - testStart("test_encode_segs"); + testStartSymbol("test_encode_segs", &symbol); for (i = 0; i < data_size; i++) { @@ -2747,7 +2935,7 @@ static void test_encode_segs(const testCtx *const p_ctx) { testFinish(); } -/* #181 Nico Gunkel OSS-Fuzz */ +/* #181 Nico Gunkel OSS-Fuzz and #300 Andre Maute */ static void test_fuzz(const testCtx *const p_ctx) { int debug = p_ctx->debug; @@ -2757,11 +2945,12 @@ static void test_fuzz(const testCtx *const p_ctx) { int length; int input_mode; int option_1; + int option_2; int ret; }; /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */ struct item data[] = { - /* 0*/ { BARCODE_AZTEC, + /* 0*/ { BARCODE_AZTEC, "\133\060\060\060\135\060\125\125\125\125\140\060\125\125\125\125\060\060\060\271\060\060\125\103\164\125\125\125\377\377\125\125" "\125\125\125\125\125\133\060\076\060\135\261\177\261\261\261\236\261\261\261\040\261\261\261\261\261\261\261\020\261\261\261\261" "\261\261\265\261\261\261\261\261\261\261\261\261\261\261\261\040\224\261\261\261\261\261\000\000\004\000\031\060\031\031\031\031" @@ -2833,8 +3022,9 @@ static void test_fuzz(const testCtx *const p_ctx) { "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\261\261\261\261\261\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\135\135\135\135\135\135" "\135\335\135\060\060\010\010\010\010\010\060", - 2251, DATA_MODE, -1, ZINT_ERROR_TOO_LONG }, /* Original OSS-Fuzz triggering data for malloc leak */ - /* 1*/ { BARCODE_AZTEC, + 2251, DATA_MODE, -1, -1, ZINT_ERROR_TOO_LONG + }, /* Original OSS-Fuzz triggering data for malloc leak */ + /* 1*/ { BARCODE_AZTEC, "\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060" "\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\000\060\060\060\060\000\060\060\000\060\060\060\060" "\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060" @@ -2923,8 +3113,9 @@ static void test_fuzz(const testCtx *const p_ctx) { "\060\060\060\363\060\060\060\060\060\060\060\060\060\060\060\060\362\060\060\060\060\060\000\060\060\377\060\060\060\175\175\175" "\175\060\060\060\175\175\175\175\060\060\005\060\005\060\005\060\060\060\060\000\000\060\060\060\060\060\060\377\060\060\060\060" "\377\060\377\377\060\060\057\060\060\057\060\060\060\000\000\060\060", - 2801, DATA_MODE, -1, ZINT_ERROR_TOO_LONG }, /* Original OSS-Fuzz triggering data for binary_string buffer overrun */ - /* 2*/ { BARCODE_AZTEC, + 2801, DATA_MODE, -1, -1, ZINT_ERROR_TOO_LONG + }, /* Original OSS-Fuzz triggering data for binary_string buffer overrun */ + /* 2*/ { BARCODE_AZTEC, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" @@ -2958,8 +3149,9 @@ static void test_fuzz(const testCtx *const p_ctx) { "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123", - 4483, -1, 1, 0 }, /* 4483 = (1664 (Max codewords) - 169 (ECC codewords) - 2 (overhead)) * 3 (3 4-bit digits per 12-bit wordcode) */ - /* 3*/ { BARCODE_AZTEC, + 4483, -1, 1, -1, 0 + }, /* 4483 = (1664 (Max codewords) - 169 (ECC codewords) - 5/12 (D/L) - 3/12 (padding)) * 3 (3 4-bit digits per 12-bit wordcode) = 4483 */ + /* 3*/ { BARCODE_AZTEC, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" @@ -2993,8 +3185,9 @@ static void test_fuzz(const testCtx *const p_ctx) { "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123", - 4484, -1, 1, ZINT_ERROR_TOO_LONG }, - /* 4*/ { BARCODE_AZTEC, + 4484, -1, 1, -1, ZINT_ERROR_TOO_LONG + }, + /* 4*/ { BARCODE_AZTEC, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -3023,8 +3216,9 @@ static void test_fuzz(const testCtx *const p_ctx) { "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY", - 3587, -1, 1, 0 }, - /* 5*/ { BARCODE_AZTEC, + 3587, -1, 1, -1, 0 + }, + /* 5*/ { BARCODE_AZTEC, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -3053,8 +3247,9 @@ static void test_fuzz(const testCtx *const p_ctx) { "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ", - 3588, -1, 1, ZINT_ERROR_TOO_LONG }, - /* 6*/ { BARCODE_AZTEC, + 3588, -1, 1, -1, ZINT_ERROR_TOO_LONG + }, + /* 6*/ { BARCODE_AZTEC, "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" @@ -3106,13 +3301,14 @@ static void test_fuzz(const testCtx *const p_ctx) { "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" - "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240", - 2079, -1, 1, 0 }, - /* 7*/ { BARCODE_AZTEC, "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240", + 2237, -1, 1, -1, 0 + }, + /* 7*/ { BARCODE_AZTEC, "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" @@ -3160,14 +3356,143 @@ static void test_fuzz(const testCtx *const p_ctx) { "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" - "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240", - 2080, -1, 1, ZINT_ERROR_TOO_LONG }, + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240" + "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240", + 2238, -1, 1, -1, ZINT_ERROR_TOO_LONG + }, + /* 8*/ { BARCODE_AZTEC, + "\105\105\000\000\000\000\000\000\000\000\077\012\377\377\377\072\376\376\350\350\350\350\350\250\350\350\350\350\354\350\350\350\350\350\001\000\000\000\000\000" + "\000\036\103\012\072\103\103\000\100\116\000\000\000\000\000\000\000\000\000\000\002\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\077\012" + "\377\377\377\072\376\376\350\350\350\350\350\250\350\350\350\350\354\350\350\350\000\000\000\000\000\000\000\033\000\036\103\012\072\103\103\000\100\116\000\000" + "\000\000\000\000\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\012\000\000\000\000\072\103\103\103\103\012\012\000\365\365\365\365\365\365\374\365\365\365\365\365\000\000\001\000\000\000\000\000\100\377\337\377" + "\377\377\377\377\000\000\000\000\372\377\000\100\377\377\350\350\000\000\350\350\350\350\350\350\350\350\001\000\000\000\000\000\000\036\103\012\072\103\365\000" + "\000\000\000\000\000\000\000\000\377\377\377\350\350\350\350\350\350\350\350\350\350\350\350\350\350\061\350\350\350\350\354\350\350\350\350\350\001\000\000\000" + "\000\000\000\036\103\012\072\103\103\000\100\116\000\000\000\000\000\000\000\000\000\000\000\216\000\000\000\000\000\000\000\377\377\377\377\377\377\377\000\000" + "\377\365\374\365\365\365\365\001\236\365\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\064\064\064\064\064\064\064\064\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153" + "\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\064\064\064\064\064\064\064\064\064\064\044\064\064\064\064\064\064\064\064\064" + "\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\064\264\264\362\362\362\362\242\242\242\242\242\242\242\242\242\242\242\242\242\242\242\242\242" + "\242\242\242\242\242\242\242\242\242\242\242\242\242\103\000\100\116\000\000\000\000\000\000\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\072\103\103\103\103\012\012\000\365\365\365\365\365" + "\365\374\365\365\365\365\365\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100\377\377\377\377\377\377\377\000\000\000\000" + "\000\000\000\100\377\377\350\350\000\000\350\350\350\350\350\350\350\350\001\000\000\000\000\000\000\036\103\012\072\103\365\000\000\000\000\000\000\000\266\266" + "\266\266\112\000\000\000\266\266\266\266\266\266\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\077\012\377" + "\377\377\072\376\376\350\350\350\350\350\000\000\000\000\001\000\000\000\350\350\350\001\000\000\000\000\000\000\036\103\012\072\103\103\000\100\116\000\000\000" + "\000\000\000\000\000\000\000\000\222\000\000\000\000\000\000\000\000\000\000\025\000\000\000\000\001\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000" + "\000\000\012\000\000\000\000\072\103\103\103\103\012\012\000\365\365\365\365\365\365\374\365\365\365\365\365\000\000\000\311\000\000\000\000\100\377\337\377\377" + "\377\377\377\000\000\000\000\000\000\000\100\377\377\350\353\000\000\350\150\350\350\350\350\350\350\001\000\000\000\000\000\000\036\103\012\072\103\365\000\000" + "\000\000\000\000\000\047\000\377\377\377\350\350\350\350\350\350\350\350\350\350\350\350\350\350\254\350\350\350\350\354\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\350\350\350\350\350\001\000\000\127\000\000\000\036\103" + "\012\072\103\103\000\100\116\000\000\000\000\000\000\000\000\000\000\000\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\050\050\050\000\000\000" + "\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\000\000\000\000\000\000\000\000\000\000\000\000\266" + "\266\266\266\266\266\377\377\377\377\377\013\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\005\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\266\266\266\266\266\266\266\266\266\266\377\377\377\377\377\377\377\377\377\377\377\377\044" + "\377\377\377\377\377\377\050\064\064\064\000\000\000\000\072\376\376\350\350\350\350\350\350\377\377\377\377\377\377\377\377\377\377\377\377\377\005\377\377\377" + "\377\350\350\350\350\350\350\350\310\350\350\001\000\000\000\000\000\000\036\103\012\072\103\103\000\000\000\000\000\000\000\000\000\000\000\000\000\000\266\266" + "\266\266\266\266\377\377\377\377\377\013\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\005\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\266\266\266\266\266\266\266\266\266\266\377\377\377\377\377\377\377\377\377\377\377\377\044\377" + "\377\377\377\377\377\050\064\064\064\000\000\000\000\072\376\376\350\350\350\350\350\350\377\377\377\377\377\377\377\377\377\377\377\377\377\005\377\377\377\377" + "\350\350\350\350\350\350\350\310\350\350\001\000\000\000\000\000\000\036\103\012\072\103\103\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\310\000\064\064\064\064\064\064\064\064\064\064\064\064\064\064\073\064\064\064\064" + "\064\064\064\064\064\064\064\064\000\377\365\374\365\365\365\365\001\236\365\000\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\064\064\064\064\064\064\064\064\153\153\153\153\153" + "\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\337\266\266\266\000" + "\000\000\000\000\000\000\377\377\377\377\377\000\000\000\000\000\000\000\100\377\377\350\350\000\000\350\350\350\350\350\350\350\350\001\000\000\000\000\000\000" + "\036\103\012\072\103\365\000\000\000\000\000\000\000\000\000\377\377\377\350\350\350\350\350\350\350\350\350\350\350\350\350\350\254\350\350\350\350\354\350\350" + "\350\350\350\001\000\000\000\000\000\000\036\103\012\072\103\103\000\100\116\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\050\000\050\050\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\377\377\377\377\377\377\000\177\377\377\377" + "\046\000\000\000\000\000\000\027\027\027\027\027\027\027\027\027\027\027\027\000\027\027\027\027\000\004\000\000\000\000\000\135\000\044\103\000\000\377\377\377" + "\377\377\103\377\364\377\364", + 2167, DATA_MODE, -1, 1, ZINT_ERROR_TOO_LONG + }, /* #300 (#2) Andre Maute */ + /* 9*/ { BARCODE_AZTEC, + "111\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "111", + 2054, DATA_MODE, 1, -1, 0 + }, /* 2048 byte block surrounded by digits */ }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_fuzz"); + char escaped[8192]; + char cmp_buf[32768]; + char cmp_msg[8192]; + + int do_zxingcpp = (debug & ZINT_DEBUG_TEST_ZXINGCPP) && testUtilHaveZXingCPPDecoder(); /* Only do ZXing-C++ test if asked, too slow otherwise */ + + testStartSymbol("test_fuzz", &symbol); for (i = 0; i < data_size; i++) { @@ -3176,11 +3501,26 @@ static void test_fuzz(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, -1, -1, -1 /*output_options*/, data[i].data, data[i].length, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, -1 /*output_options*/, data[i].data, data[i].length, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + if (ret < ZINT_ERROR) { + + if (do_zxingcpp && testUtilCanZXingCPP(i, symbol, data[i].data, length, debug)) { + int cmp_len, ret_len; + char modules_dump[22801 + 1]; + assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, "i:%d testUtilModulesDump == -1\n", i); + ret = testUtilZXingCPP(i, symbol, data[i].data, length, modules_dump, cmp_buf, sizeof(cmp_buf), &cmp_len); + assert_zero(ret, "i:%d %s testUtilZXingCPP ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilZXingCPPCmp(symbol, cmp_msg, cmp_buf, cmp_len, data[i].data, length, NULL /*primary*/, escaped, &ret_len); + assert_zero(ret, "i:%d %s testUtilZXingCPPCmp %d != 0 %s\n actual: %.*s\nexpected: %.*s\n", + i, testUtilBarcodeName(symbol->symbology), ret, cmp_msg, cmp_len, cmp_buf, ret_len, escaped); + } + } + ZBarcode_Delete(symbol); } @@ -3299,6 +3639,7 @@ static void test_perf(const testCtx *const p_ctx) { int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func */ + { "test_large", test_large }, { "test_options", test_options }, { "test_encode", test_encode }, { "test_encode_segs", test_encode_segs }, diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index 925e3e33..b1446117 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -216,9 +216,9 @@ static void test_checks(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_checks"); + testStartSymbol("test_checks", &symbol); for (i = 0; i < data_size; i++) { @@ -296,22 +296,22 @@ static void test_checks_segs(const testCtx *const p_ctx) { /* 2*/ { BARCODE_CODE128, -1, { { NULL, 0, 0 }, { NULL, 0, 0 } }, 1, -1, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 772: Input segment 0 source NULL" }, /* 3*/ { BARCODE_CODE128, -1, { { TU(""), 0, 0 }, { NULL, 0, 0 } }, 1, -1, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 778: No input data" }, /* 4*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 0 }, { NULL, 0, 0 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 772: Input segment 1 source NULL" }, - /* 4*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 0 }, { TU(""), 0, 0 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 773: Input segment 1 empty" }, - /* 5*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 0 } }, 2, -1, 4, -1, ZINT_ERROR_INVALID_OPTION, "Error 774: Symbol ECI 4 must match segment zero ECI 3" }, - /* 6*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 775: Symbology does not support multiple segments" }, - /* 7*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { NULL, 0, 0 } }, 1, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 217: Symbology does not support ECI switching" }, - /* 8*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 1 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 218: Invalid ECI code 1" }, - /* 9*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 776: GS1 mode not supported for multiple segments" }, - /* 10*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("\200"), 0, 4 } }, 2, UNICODE_MODE, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 245: Invalid UTF-8 in input data" }, - /* 11*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, -1, -1, -1, 0, "" }, - /* 12*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 0 }, { TU("B"), 0, 4 } }, 2, -1, 3, -1, 0, "" }, - /* 13*/ { BARCODE_AZTEC, -1, { { TU("A"), ZINT_MAX_DATA_LEN, 3 }, { TU("B"), 1, 4 } }, 2, -1, -1, -1, ZINT_ERROR_TOO_LONG, "Error 243: Input data too long" }, + /* 5*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 0 }, { TU(""), 0, 0 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 773: Input segment 1 empty" }, + /* 6*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 0 } }, 2, -1, 4, -1, ZINT_ERROR_INVALID_OPTION, "Error 774: Symbol ECI 4 must match segment zero ECI 3" }, + /* 7*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 775: Symbology does not support multiple segments" }, + /* 8*/ { BARCODE_CODE128, -1, { { TU("A"), 0, 3 }, { NULL, 0, 0 } }, 1, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 217: Symbology does not support ECI switching" }, + /* 9*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 1 } }, 2, -1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 218: Invalid ECI code 1" }, + /* 10*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 776: GS1 mode not supported for multiple segments" }, + /* 11*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("\200"), 0, 4 } }, 2, UNICODE_MODE, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 245: Invalid UTF-8 in input data" }, + /* 12*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 3 }, { TU("B"), 0, 4 } }, 2, -1, -1, -1, 0, "" }, + /* 13*/ { BARCODE_AZTEC, -1, { { TU("A"), 0, 0 }, { TU("B"), 0, 4 } }, 2, -1, 3, -1, 0, "" }, + /* 14*/ { BARCODE_AZTEC, -1, { { TU("A"), ZINT_MAX_DATA_LEN, 3 }, { TU("B"), 1, 4 } }, 2, -1, -1, -1, ZINT_ERROR_TOO_LONG, "Error 243: Input data too long" }, }; int data_size = ARRAY_SIZE(data); int i, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_checks_segs"); + testStartSymbol("test_checks_segs", &symbol); for (i = 0; i < data_size; i++) { @@ -362,11 +362,11 @@ static void test_input_data(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char *text; - testStart("test_input_data"); + testStartSymbol("test_input_data", &symbol); for (i = 0; i < data_size; i++) { @@ -438,9 +438,9 @@ static void test_input_mode(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_input_mode"); + testStartSymbol("test_input_mode", &symbol); for (i = 0; i < data_size; i++) { @@ -546,12 +546,12 @@ static void test_escape_char_process(const testCtx *const p_ctx) { /* 66*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U000F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, /* 67*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U0000F", "", ZINT_ERROR_INVALID_DATA, 0, "Error 209: Incomplete '\\U' escape sequence in input data", 0, "" }, /* 68*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\U110000", "", ZINT_ERROR_INVALID_DATA, 0, "Error 246: Invalid value for '\\U' escape sequence in input data", 0, "" }, - /* 69*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 25, "\\U10FFFF", "", 0, 14, "F1 1A 01 01 EB 80 EB 80 3F C0 9C 0B 4B B8 DA B7 B6 1A", 0, "" }, - /* 70*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, "\\U10FFFF", "", 0, 14, "F1 1B 01 E7 EC 71 D7 6C 20 D6 B3 63 E2 18 B6 4C 7D 3E", 0, "" }, - /* 71*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 32, "\\U10FFFF", "", 0, 32, "F1 21 01 EB 05 32 EB 25 3A 81 7E 98 9B 50 AC 1C E0 4E 51 BA 23", 0, "" }, - /* 72*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 33, "\\U10FFFF", "", 0, 14, "F1 22 01 01 EB 80 EB 80 A3 E5 BE FB 1A 08 94 2E C3 74", 0, "" }, - /* 73*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 34, "\\U10FFFF", "", 0, 16, "F1 23 01 01 01 01 01 01 EB 80 EB 80 F6 F1 5D 2A D1 0A BF BC B8 22 65 0C", 0, "" }, - /* 74*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 35, "\\U10FFFF", "", 0, 16, "F1 24 01 01 01 01 EB 80 EB 80 01 01 7F 58 28 41 7F 63 0E EB A7 D8 D0 1F", 0, "" }, + /* 69*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 25, "\\U10FFFF", "", 0, 14, "F1 1A E7 57 C7 81 F7 AC 09 06 28 51 F3 00 E1 8C 2A 1C", 0, "" }, + /* 70*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, "\\U10FFFF", "", 0, 14, "F1 1B E7 57 E0 11 D7 6C 4F 45 E2 B3 FF F1 72 AB 54 9F", 0, "" }, + /* 71*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 32, "\\U10FFFF", "", 0, 14, "F1 21 EB 64 33 EB 1B 36 1D F7 B1 6D 8C A6 34 64 19 3A", 0, "" }, + /* 72*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 33, "\\U10FFFF", "", 0, 14, "F1 22 E7 57 EB 5D 17 8C C1 B0 B6 B2 53 78 E4 7D 61 CB", 0, "" }, + /* 73*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 34, "\\U10FFFF", "", 0, 14, "F1 23 01 11 EB 80 EB 80 90 33 51 1B FA AE 78 F7 05 44", 0, "" }, + /* 74*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 35, "\\U10FFFF", "", 0, 14, "F1 24 EB 80 EB 80 11 01 17 BA C6 05 9F 4C EA E5 18 31", 0, "" }, /* 75*/ { BARCODE_GS1_128_CC, GS1_MODE, -1, "[20]10", "[10]A", 0, 99, "(7) 105 102 20 10 100 59 106", 0, "" }, /* 76*/ { BARCODE_GS1_128_CC, GS1_MODE, -1, "[2\\x30]1\\d048", "[\\x310]\\x41", 0, 99, "(7) 105 102 20 10 100 59 106", 1, "" }, /* 77*/ { BARCODE_DATAMATRIX, DATA_MODE, -1, "\\^A1", "", ZINT_ERROR_INVALID_DATA, 0, "Error 798: Escape '\\^' only valid for Code 128 in extra escape mode", 0, "" }, @@ -561,7 +561,7 @@ static void test_escape_char_process(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char escaped[1024]; char escaped_composite[1024]; @@ -570,7 +570,7 @@ static void test_escape_char_process(const testCtx *const p_ctx) { char *text; - testStart("test_escape_char_process"); + testStartSymbol("test_escape_char_process", &symbol); for (i = 0; i < data_size; i++) { @@ -647,6 +647,63 @@ static void test_escape_char_process(const testCtx *const p_ctx) { testFinish(); } +INTERNAL int escape_char_process_test(struct zint_symbol *symbol, unsigned char *input_string, int *p_length, + unsigned char *escaped_string); + +static void test_escape_char_process_test(const testCtx *const p_ctx) { + + struct item { + int symbology; + int input_mode; + char *data; + int ret; + char *expected; + int expected_len; + }; + struct item data[] = { + /* 0*/ { 0, 0, "BLANK", 0, "BLANK", 5 }, + /* 1*/ { 0, 0, "\\0\\E\\a\\b\\t\\n\\v\\f\\r\\e\\G\\R\\x81\\\\\\o201\\d255", 0, "\000\004\a\b\t\n\v\f\r\033\035\036\201\\\201\377", 16 }, + /* 2*/ { 0, 0, "\\U010283", 0, "\360\220\212\203", 4 }, + /* 3*/ { 0, 0, "\\u007F\\u0080\\u011E\\u13C9\\U010283", 0, "\177\302\200\304\236\341\217\211\360\220\212\203", 12 }, + /* 4*/ { BARCODE_CODE128, EXTRA_ESCAPE_MODE, "\\^A\\^^\\^B", 0, "\\^A\\^^\\^B", 9 }, + }; + int data_size = ARRAY_SIZE(data); + int i, length, ret; + + + testStart("test_escape_char_process_test"); + + for (i = 0; i < data_size; i++) { + + struct zint_symbol symbol = {0}; + int escaped_len; + char escaped[1024]; + + if (testContinue(p_ctx, i)) continue; + + symbol.symbology = data[i].symbology; + symbol.input_mode = data[i].input_mode; + length = strlen(data[i].data); + + escaped_len = length; + ret = escape_char_process_test(&symbol, (unsigned char *) data[i].data, &escaped_len, NULL); + assert_equal(ret, data[i].ret, "i:%d escape_char_process_test(NULL) ret %d != %d (%s)\n", i, ret, data[i].ret, symbol.errtxt); + assert_equal(escaped_len, data[i].expected_len, "i:%d NULL escaped_len %d != %d\n", i, escaped_len, data[i].expected_len); + + memset(escaped, 0xDD, sizeof(escaped)); + + escaped_len = length; + ret = escape_char_process_test(&symbol, (unsigned char *) data[i].data, &escaped_len, (unsigned char *) escaped); + assert_equal(ret, data[i].ret, "i:%d escape_char_process_test(escaped) ret %d != %d (%s)\n", i, ret, data[i].ret, symbol.errtxt); + assert_equal(escaped_len, data[i].expected_len, "i:%d escaped escaped_len %d != %d\n", i, escaped_len, data[i].expected_len); + + assert_zero(memcmp(escaped, data[i].expected, escaped_len), "i:%d memcmp() != 0\n", i); + assert_zero(escaped[escaped_len], "i:%d escaped[%d] not NUL-terminated (0x%X)\n", i, escaped_len, escaped[escaped_len]); + } + + testFinish(); +} + static void test_cap(const testCtx *const p_ctx) { struct item { @@ -1593,6 +1650,7 @@ int main(int argc, char *argv[]) { { "test_symbologies", test_symbologies }, { "test_input_mode", test_input_mode }, { "test_escape_char_process", test_escape_char_process }, + { "test_escape_char_process_test", test_escape_char_process_test }, { "test_cap", test_cap }, { "test_cap_compliant_height", test_cap_compliant_height }, { "test_encode_file_empty", test_encode_file_empty }, diff --git a/backend/tests/test_pdf417.c b/backend/tests/test_pdf417.c index 3559b8b2..1ff09225 100644 --- a/backend/tests/test_pdf417.c +++ b/backend/tests/test_pdf417.c @@ -5324,7 +5324,7 @@ static void test_fuzz(const testCtx *const p_ctx) { "\101\000\000\000\000\374\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\323\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" "\000\000\000\000\000\000\000\000\323\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" "\000\000\000\000\000\000\000\000", - 1048, 0, 0 }, /* #300 Andre Maute */ + 1048, 0, 0 }, /* #300 (#1) Andre Maute */ }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index 2e914a5d..9cc8d718 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -3802,7 +3802,8 @@ int testUtilZXingCPP(int index, struct zint_symbol *symbol, const char *source, return 0; } -INTERNAL int escape_char_process_test(struct zint_symbol *symbol, unsigned char *input_string, int *length); +INTERNAL int escape_char_process_test(struct zint_symbol *symbol, unsigned char *input_string, int *length, + unsigned char *escaped_string); #include "../gs1.h" @@ -3850,13 +3851,15 @@ int testUtilZXingCPPCmp(struct zint_symbol *symbol, char *msg, char *cmp_buf, in } if (is_escaped) { - memcpy(escaped, expected, expected_len); if (symbol->input_mode & ESCAPE_MODE) { - ret = escape_char_process_test(symbol, (unsigned char *) escaped, &expected_len); + ret = escape_char_process_test(symbol, (unsigned char *) expected, &expected_len, + (unsigned char *) escaped); if (ret != 0) { sprintf(msg, "escape_char_process %d != 0", ret); return 3; } + } else { + memcpy(escaped, expected, expected_len); } if (is_extra_escaped) { /* Remove any Code 128 special escapes */ diff --git a/backend/tests/tools/run_zxingcpp_tests.sh b/backend/tests/tools/run_zxingcpp_tests.sh index d5196f12..8cb4f6ce 100755 --- a/backend/tests/tools/run_zxingcpp_tests.sh +++ b/backend/tests/tools/run_zxingcpp_tests.sh @@ -14,8 +14,10 @@ function run_zxingcpp_test() { } run_zxingcpp_test "test_2of5" "encode" +run_zxingcpp_test "test_aztec" "large" run_zxingcpp_test "test_aztec" "encode" run_zxingcpp_test "test_aztec" "encode_segs" +run_zxingcpp_test "test_aztec" "fuzz" run_zxingcpp_test "test_codablock" "input" run_zxingcpp_test "test_codablock" "encode" run_zxingcpp_test "test_code" "encode"