1
0
mirror of https://git.code.sf.net/p/zint/code synced 2026-06-10 15:43:40 +00:00

aztec: avoid possible overflow in comparison

output/CLI/testcommon: suppress some gcc-16 (C23) warnings
  "-Wdiscarded-qualifiers" (QChar)
GUI: suppress some gcc-16 (C23) warnings
  "-Wdeprecated-enum-enum-conversion"
channel: use explicit `const struct` for precalcs instead of
  typedef (makes code more transparent)
README.linux: Fedora 43 -> 44
This commit is contained in:
gitlost
2026-05-15 11:20:30 +01:00
parent 76aac611ca
commit 09d48d5757
9 changed files with 39 additions and 36 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
% README.linux 2026-01-01 % README.linux 2026-05-15
% Tested on Ubuntu 20.04.4 LTS, Ubuntu 22.04 LTS, Ubuntu 24.04 LTS and % Tested on Ubuntu 20.04.4 LTS, Ubuntu 22.04 LTS, Ubuntu 24.04 LTS and
% Fedora Linux 43 (Workstation Edition) % Fedora Linux 44 (Workstation Edition)
% vim: set ts=4 sw=4 et : % vim: set ts=4 sw=4 et :
1. Prerequisites for building zint 1. Prerequisites for building zint
+2 -2
View File
@@ -497,7 +497,7 @@ static int az_tokens_add_chk(struct az_state *state, const int extra) {
} }
state->tokens.size = size; state->tokens.size = size;
state->tokens.used = 0; state->tokens.used = 0;
} else if (state->tokens.used + extra >= state->tokens.size) { } else if (state->tokens.used >= state->tokens.size - extra) { /* Compare this way to avoid possible overflow */
struct az_token *tokens; struct az_token *tokens;
const unsigned short size = state->tokens.size * 2; const unsigned short size = state->tokens.size * 2;
if (size <= state->tokens.size /* Overflow */ if (size <= state->tokens.size /* Overflow */
@@ -1029,7 +1029,7 @@ static int az_binary_string(const unsigned char source[], const int length, int
} }
for (i = 0; i < stateEnd.tokens.used; i++) { for (i = 0; i < stateEnd.tokens.used; i++) {
const struct az_token *token = stateEnd.tokens.tokens + i; const struct az_token *const token = stateEnd.tokens.tokens + i;
const int count = token->count; const int count = token->count;
if (count < 0) { if (count < 0) {
bp = z_bin_append_posn(token->value, -count, binary_string, bp); bp = z_bin_append_posn(token->value, -count, binary_string, bp);
+7 -6
View File
@@ -35,9 +35,9 @@
#include <stdio.h> #include <stdio.h>
#include "common.h" #include "common.h"
typedef const struct s_channel_precalc { struct channel_precalc {
int value; unsigned char B[8]; unsigned char S[8]; unsigned char bmax[7]; unsigned char smax[7]; int value; unsigned char B[8]; unsigned char S[8]; unsigned char bmax[7]; unsigned char smax[7];
} channel_precalc; };
#if 0 #if 0
#define CHANNEL_GENERATE_PRECALCS #define CHANNEL_GENERATE_PRECALCS
@@ -49,8 +49,8 @@ typedef const struct s_channel_precalc {
static void channel_generate_precalc(int channels, int value, int mod, int last, int B[8], int S[8], int bmax[7], static void channel_generate_precalc(int channels, int value, int mod, int last, int B[8], int S[8], int bmax[7],
int smax[7]) { int smax[7]) {
int i; int i;
if (value == mod) printf("static channel_precalc channel_precalcs%d[] = {\n", channels); if (value == mod) printf("static const struct channel_precalc channel_precalcs%d[] = {\n", channels);
printf(" { %7ld, {", value); for (i = 0; i < 8; i++) printf(" %d,", B[i]); fputs(" },", stdout); printf(" { %7d, {", value); for (i = 0; i < 8; i++) printf(" %d,", B[i]); fputs(" },", stdout);
fputs(" {", stdout); for (i = 0; i < 8; i++) printf(" %d,", S[i]); fputs(" },", stdout); fputs(" {", stdout); for (i = 0; i < 8; i++) printf(" %d,", S[i]); fputs(" },", stdout);
fputs(" {", stdout); for (i = 0; i < 7; i++) printf(" %d,", bmax[i]); fputs(" },", stdout); fputs(" {", stdout); for (i = 0; i < 7; i++) printf(" %d,", bmax[i]); fputs(" },", stdout);
fputs(" {", stdout); for (i = 0; i < 7; i++) printf(" %d,", smax[i]); fputs(" }, },\n", stdout); fputs(" {", stdout); for (i = 0; i < 7; i++) printf(" %d,", smax[i]); fputs(" }, },\n", stdout);
@@ -60,7 +60,8 @@ static void channel_generate_precalc(int channels, int value, int mod, int last,
#include "channel_precalcs.h" #include "channel_precalcs.h"
#endif #endif
static int channel_copy_precalc(channel_precalc *const precalc, int B[8], int S[8], int bmax[7], int smax[7]) { static int channel_copy_precalc(const struct channel_precalc *const precalc, int B[8], int S[8], int bmax[7],
int smax[7]) {
int i; int i;
for (i = 0; i < 7; i++) { for (i = 0; i < 7; i++) {
@@ -89,7 +90,7 @@ static void CHNCHR(int channels, int target_value, int B[8], int S[8]) {
/* Use of initial pre-calculations taken from Barcode Writer in Pure PostScript (BWIPP) /* Use of initial pre-calculations taken from Barcode Writer in Pure PostScript (BWIPP)
Copyright (c) 2004-2026 Terry Burton */ Copyright (c) 2004-2026 Terry Burton */
/* SPDX-License-Identifier: MIT */ /* SPDX-License-Identifier: MIT */
static channel_precalc initial_precalcs[6] = { static const struct channel_precalc initial_precalcs[6] = {
{ 0, { 1, 1, 1, 1, 1, 2, 1, 2, }, { 1, 1, 1, 1, 1, 1, 1, 3, }, { 1, 1, 1, 1, 1, 3, 2, }, { 0, { 1, 1, 1, 1, 1, 2, 1, 2, }, { 1, 1, 1, 1, 1, 1, 1, 3, }, { 1, 1, 1, 1, 1, 3, 2, },
{ 1, 1, 1, 1, 1, 3, 3, }, }, { 1, 1, 1, 1, 1, 3, 3, }, },
{ 0, { 1, 1, 1, 1, 2, 1, 1, 3, }, { 1, 1, 1, 1, 1, 1, 1, 4, }, { 1, 1, 1, 1, 4, 3, 3, }, { 0, { 1, 1, 1, 1, 2, 1, 1, 3, }, { 1, 1, 1, 1, 1, 1, 1, 4, }, { 1, 1, 1, 1, 4, 3, 3, },
+3 -3
View File
@@ -1,6 +1,6 @@
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2020-2022 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2020-2026 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@@ -35,13 +35,13 @@
/* Channel code precalculated values to avoid excessive looping */ /* Channel code precalculated values to avoid excessive looping */
/* To generate uncomment CHANNEL_GENERATE_PRECALCS define and run "backend/tests/test_channel -f generate -g" */ /* To generate uncomment CHANNEL_GENERATE_PRECALCS define and run "backend/tests/test_channel -f generate -g" */
/* Paste result below here */ /* Paste result below here */
static channel_precalc channel_precalcs7[] = { static const struct channel_precalc channel_precalcs7[] = {
{ 115338, { 1, 3, 1, 1, 1, 1, 5, 1, }, { 1, 1, 1, 2, 1, 2, 3, 3, }, { 1, 7, 5, 5, 5, 5, 5, }, { 1, 7, 7, 7, 6, 6, 5, }, }, { 115338, { 1, 3, 1, 1, 1, 1, 5, 1, }, { 1, 1, 1, 2, 1, 2, 3, 3, }, { 1, 7, 5, 5, 5, 5, 5, }, { 1, 7, 7, 7, 6, 6, 5, }, },
{ 230676, { 1, 1, 2, 2, 4, 1, 1, 2, }, { 1, 2, 1, 3, 2, 1, 3, 1, }, { 1, 7, 7, 6, 5, 2, 2, }, { 1, 7, 6, 6, 4, 3, 3, }, }, { 230676, { 1, 1, 2, 2, 4, 1, 1, 2, }, { 1, 2, 1, 3, 2, 1, 3, 1, }, { 1, 7, 7, 6, 5, 2, 2, }, { 1, 7, 6, 6, 4, 3, 3, }, },
{ 346014, { 1, 2, 3, 1, 1, 1, 3, 2, }, { 1, 2, 2, 1, 1, 3, 1, 3, }, { 1, 7, 6, 4, 4, 4, 4, }, { 1, 7, 6, 5, 5, 5, 3, }, }, { 346014, { 1, 2, 3, 1, 1, 1, 3, 2, }, { 1, 2, 2, 1, 1, 3, 1, 3, }, { 1, 7, 6, 4, 4, 4, 4, }, { 1, 7, 6, 5, 5, 5, 3, }, },
{ 461352, { 1, 2, 1, 1, 1, 2, 2, 4, }, { 1, 3, 1, 1, 3, 2, 2, 1, }, { 1, 7, 6, 6, 6, 6, 5, }, { 1, 7, 5, 5, 5, 3, 2, }, }, { 461352, { 1, 2, 1, 1, 1, 2, 2, 4, }, { 1, 3, 1, 1, 3, 2, 2, 1, }, { 1, 7, 6, 6, 6, 6, 5, }, { 1, 7, 5, 5, 5, 3, 2, }, },
}; };
static channel_precalc channel_precalcs8[] = { static const struct channel_precalc channel_precalcs8[] = {
{ 119121, { 2, 1, 3, 2, 1, 3, 2, 1, }, { 1, 1, 1, 4, 3, 2, 1, 2, }, { 8, 7, 7, 5, 4, 4, 2, }, { 8, 8, 8, 8, 5, 3, 2, }, }, { 119121, { 2, 1, 3, 2, 1, 3, 2, 1, }, { 1, 1, 1, 4, 3, 2, 1, 2, }, { 8, 7, 7, 5, 4, 4, 2, }, { 8, 8, 8, 8, 5, 3, 2, }, },
{ 238242, { 2, 1, 1, 2, 2, 2, 1, 4, }, { 1, 1, 3, 1, 1, 2, 4, 2, }, { 8, 7, 7, 7, 6, 5, 4, }, { 8, 8, 8, 6, 6, 6, 5, }, }, { 238242, { 2, 1, 1, 2, 2, 2, 1, 4, }, { 1, 1, 3, 1, 1, 2, 4, 2, }, { 8, 7, 7, 7, 6, 5, 4, }, { 8, 8, 8, 6, 6, 6, 5, }, },
{ 357363, { 2, 2, 1, 4, 1, 1, 1, 3, }, { 1, 1, 1, 1, 3, 2, 5, 1, }, { 8, 7, 6, 6, 3, 3, 3, }, { 8, 8, 8, 8, 8, 6, 5, }, }, { 357363, { 2, 2, 1, 4, 1, 1, 1, 3, }, { 1, 1, 1, 1, 3, 2, 5, 1, }, { 8, 7, 6, 6, 3, 3, 3, }, { 8, 8, 8, 8, 8, 6, 5, }, },
+4 -6
View File
@@ -957,7 +957,7 @@ static int out_maybe_mkdir(const char *path) {
} }
/* Create output file, creating sub-directories if necessary. Returns `fopen()` FILE pointer */ /* Create output file, creating sub-directories if necessary. Returns `fopen()` FILE pointer */
INTERNAL FILE *zint_out_fopen(const char filename[256], const char *mode) { INTERNAL FILE *zint_out_fopen(char filename[256], const char *mode) {
FILE *outfile; FILE *outfile;
#ifdef _WIN32 #ifdef _WIN32
@@ -968,12 +968,10 @@ INTERNAL FILE *zint_out_fopen(const char filename[256], const char *mode) {
char dirname[256]; char dirname[256];
char *d; char *d;
#ifdef _WIN32 #ifdef _WIN32
char *dirend = strrchr(filename, '\\'); char *const dirend_backslash = strrchr(filename, '\\');
if (!dirend) { char *const dirend = dirend_backslash ? dirend_backslash : strrchr(filename, '/');
dirend = strrchr(filename, '/');
}
#else #else
char *dirend = strrchr(filename, '/'); char *const dirend = strrchr(filename, '/');
#endif #endif
if (!dirend) { if (!dirend) {
return outfile; return outfile;
+1 -1
View File
@@ -71,7 +71,7 @@ INTERNAL float zint_out_large_bar_height(struct zint_symbol *symbol, const int s
int *symbol_height_si); int *symbol_height_si);
/* Create output file, creating sub-directories if necessary. Returns `fopen()` FILE pointer */ /* Create output file, creating sub-directories if necessary. Returns `fopen()` FILE pointer */
INTERNAL FILE *zint_out_fopen(const char filename[256], const char *mode); INTERNAL FILE *zint_out_fopen(char filename[256], const char *mode);
#ifdef _WIN32 #ifdef _WIN32
/* Do `fopen()` on Windows, assuming `filename` is UTF-8 encoded. Props Marcel, ticket #288 */ /* Do `fopen()` on Windows, assuming `filename` is UTF-8 encoded. Props Marcel, ticket #288 */
+3 -2
View File
@@ -2163,7 +2163,8 @@ int testUtilHaveLibreOffice(void) {
int testUtilVerifyLibreOffice(const char *filename, int debug) { int testUtilVerifyLibreOffice(const char *filename, int debug) {
char cmd[512 + 128]; char cmd[512 + 128];
char svg[512]; char svg[512];
char *slash, *dot; const char *slash;
char *dot;
char buf[16384]; char buf[16384];
char *b = buf, *be = buf + sizeof(buf) - 1; char *b = buf, *be = buf + sizeof(buf) - 1;
FILE *fp; FILE *fp;
@@ -4347,7 +4348,7 @@ static int textUtilZXingCPPDX(const char *expected, const int expected_len, cons
/* Helper to append add-on if any to EAN-13, returning expected length */ /* Helper to append add-on if any to EAN-13, returning expected length */
static int textUtilZXingCPPEAN13AddOn(const char *expected, const int expected_len, char *out) { static int textUtilZXingCPPEAN13AddOn(const char *expected, const int expected_len, char *out) {
char *sep; const char *sep;
if ((sep = strchr(expected, '+')) != NULL || (sep = strchr(expected, ' ')) != NULL) { if ((sep = strchr(expected, '+')) != NULL || (sep = strchr(expected, ' ')) != NULL) {
const int addon_len = expected_len - (int) (sep + 1 - expected); const int addon_len = expected_len - (int) (sep + 1 - expected);
if (addon_len <= 2) { if (addon_len <= 2) {
+4 -4
View File
@@ -736,8 +736,8 @@ static int supported_filetype(const char *const filetype, const int no_png, int
} }
/* Get file extension, excluding those of more than 4 letters */ /* Get file extension, excluding those of more than 4 letters */
static char *get_extension(const char *const file) { static const char *get_extension(const char *const file) {
char *const dot = strrchr(file, '.'); const char *const dot = strrchr(file, '.');
if (dot && strlen(file) - (dot - file) <= 5) { /* Only recognize up to 4 letter extensions */ if (dot && strlen(file) - (dot - file) <= 5) { /* Only recognize up to 4 letter extensions */
return dot + 1; return dot + 1;
} }
@@ -755,7 +755,7 @@ static void set_extension(char file[256], const char *const filetype) {
cpy_str(lc_filetype, ARRAY_SIZE(lc_filetype), filetype); cpy_str(lc_filetype, ARRAY_SIZE(lc_filetype), filetype);
to_lower(lc_filetype); to_lower(lc_filetype);
extension = get_extension(file); extension = (char *) get_extension(file);
if (extension) { if (extension) {
cpy_str(lc_extension, ARRAY_SIZE(lc_extension), extension); cpy_str(lc_extension, ARRAY_SIZE(lc_extension), extension);
to_lower(lc_extension); to_lower(lc_extension);
@@ -1517,7 +1517,7 @@ int main(int argc, char **argv) {
int val; int val;
int i; int i;
int ret; int ret;
char *outfile_extension; const char *outfile_extension;
int data_arg_num = 0; int data_arg_num = 0;
int seg_count = 0; int seg_count = 0;
float x_dim_mm = 0.0f, dpmm = 0.0f; float x_dim_mm = 0.0f, dpmm = 0.0f;
+12 -9
View File
@@ -60,19 +60,22 @@
static const int tempMessageTimeout = 2000; static const int tempMessageTimeout = 2000;
// Suppress gcc-16 (C23) warning -Wdeprecated-enum-enum-conversion
#define QKC(M, K) (int(M) | int(K))
// Use on Windows also (i.e. not using QKeySequence::Quit) // Use on Windows also (i.e. not using QKeySequence::Quit)
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, quitKeySeq, (Qt::CTRL | Qt::Key_Q)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, quitKeySeq, QKC(Qt::CTRL, Qt::Key_Q))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, openCLISeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_C)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, openCLISeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_C))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyBMPSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_B)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyBMPSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_B))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyEMFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_E)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyEMFSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_E))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyGIFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_G)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyGIFSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_G))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyPNGSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_P)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyPNGSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_P))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copySVGSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_S)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copySVGSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_S))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyTIFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_T)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyTIFSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_T))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, factoryResetSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_R)) Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, factoryResetSeq, QKC(Qt::SHIFT | Qt::CTRL, Qt::Key_R))
// RGB hexadecimal 6 or 8 in length or CMYK comma-separated decimal percentages "C,M,Y,K" // RGB hexadecimal 6 or 8 in length or CMYK comma-separated decimal percentages "C,M,Y,K"
static const QString colorREstr(QSL("^([0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?)|(((100|[0-9]{0,2}),){3}(100|[0-9]{0,2}))$")); static const QString colorREstr(QSL("^([0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?)|(((100|[0-9]{0,2}),){3}(100|[0-9]{0,2}))$"));