]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
netlink_linearize: avoid strict-overflow warning in netlink_gen_bitwise()
authorThomas Haller <thaller@redhat.com>
Wed, 27 Sep 2023 12:23:28 +0000 (14:23 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 22 Jan 2025 23:05:48 +0000 (00:05 +0100)
commit d07c874797295f425541464ac84864e591fc0614 upstream.

With gcc-13.2.1-1.fc38.x86_64:

  $ gcc -Iinclude -c -o tmp.o src/netlink_linearize.c -Werror -Wstrict-overflow=5 -O3
  src/netlink_linearize.c: In function ‘netlink_gen_bitwise’:
  src/netlink_linearize.c:1790:1: error: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Werror=strict-overflow]
   1790 | }
        | ^
  cc1: all warnings being treated as errors

It also makes more sense this way, where "n" is the hight of the
"binops" stack, and we check for a non-empty stack with "n > 0" and pop
the last element with "binops[--n]".

Signed-off-by: Thomas Haller <thaller@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
src/netlink_linearize.c

index 7769d1b933e8ee7a6be9b6f88317264cb602fd80..6b965a8dd06e1bdb28802ab72f1cf8f45d8e55f6 100644 (file)
@@ -642,14 +642,13 @@ static void netlink_gen_bitwise(struct netlink_linearize_ctx *ctx,
        while (left->etype == EXPR_BINOP && left->left != NULL &&
               (left->op == OP_AND || left->op == OP_OR || left->op == OP_XOR))
                binops[n++] = left = left->left;
-       n--;
 
-       netlink_gen_expr(ctx, binops[n--], dreg);
+       netlink_gen_expr(ctx, binops[--n], dreg);
 
        mpz_bitmask(mask, expr->len);
        mpz_set_ui(xor, 0);
-       for (; n >= 0; n--) {
-               i = binops[n];
+       while (n > 0) {
+               i = binops[--n];
                mpz_set(val, i->right->value);
 
                switch (i->op) {