]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
xshared: Introduce xtables_clear_args()
authorPhil Sutter <phil@nwl.cc>
Wed, 31 Jan 2024 20:40:19 +0000 (21:40 +0100)
committerPhil Sutter <phil@nwl.cc>
Thu, 1 Feb 2024 13:51:30 +0000 (14:51 +0100)
Perform struct xtables_args object deinit in a common place, even though
it merely consists of freeing any IP addresses and masks.

This fixes for a memleak in arptables-translate as the check for
h->family didn't catch the value NFPROTO_ARP.

Fixes: 5b7324e0675e3 ("nft-arp: add arptables-translate")
Signed-off-by: Phil Sutter <phil@nwl.cc>
iptables/ip6tables.c
iptables/iptables.c
iptables/xshared.c
iptables/xshared.h
iptables/xtables-translate.c
iptables/xtables.c

index 4b5d4ac6878b707e79f46b9917ea733c214c7679..f9ae18aed8041e7c90bfe9a2a38df268150b035d 100644 (file)
@@ -892,10 +892,7 @@ int do_command6(int argc, char *argv[], char **table,
                e = NULL;
        }
 
-       free(saddrs);
-       free(smasks);
-       free(daddrs);
-       free(dmasks);
+       xtables_clear_args(&args);
        xtables_free_opts(1);
 
        return ret;
index 5ae28fe04a5f50d18ddd2d2cd54b0a113fb90395..8eb043e9b736e21b0286354e720448bebb41f7e8 100644 (file)
@@ -887,10 +887,7 @@ int do_command4(int argc, char *argv[], char **table,
                e = NULL;
        }
 
-       free(saddrs);
-       free(smasks);
-       free(daddrs);
-       free(dmasks);
+       xtables_clear_args(&args);
        xtables_free_opts(1);
 
        return ret;
index 7d073891ed5c324158eb841dffcf4e6faac6b66f..0b2724a3e51623f387b79a110d5f7ed9eb37de0e 100644 (file)
@@ -2185,3 +2185,11 @@ make_delete_mask(const struct xtables_rule_match *matches,
 
        return mask;
 }
+
+void xtables_clear_args(struct xtables_args *args)
+{
+       free(args->s.addr.ptr);
+       free(args->s.mask.ptr);
+       free(args->d.addr.ptr);
+       free(args->d.mask.ptr);
+}
index 2a9cdf45f581ab4baa06ae62e44525038d9db91c..7d4035ec03e52b60e97fc67aab3c9004c2e7f00d 100644 (file)
@@ -333,4 +333,6 @@ unsigned char *make_delete_mask(const struct xtables_rule_match *matches,
 
 void iface_to_mask(const char *ifname, unsigned char *mask);
 
+void xtables_clear_args(struct xtables_args *args);
+
 #endif /* IPTABLES_XSHARED_H */
index ad443112303231d74c786fe865bd6c070dd13b90..8ebe523c447f221c6257c5ae1315767d98624921 100644 (file)
@@ -349,17 +349,7 @@ static int do_command_xlate(struct nft_handle *h, int argc, char *argv[],
 
        h->ops->clear_cs(&cs);
 
-       if (h->family == AF_INET) {
-               free(args.s.addr.v4);
-               free(args.s.mask.v4);
-               free(args.d.addr.v4);
-               free(args.d.mask.v4);
-       } else if (h->family == AF_INET6) {
-               free(args.s.addr.v6);
-               free(args.s.mask.v6);
-               free(args.d.addr.v6);
-               free(args.d.mask.v6);
-       }
+       xtables_clear_args(&args);
        xtables_free_opts(1);
 
        return ret;
index 22d6ea58376fc0d0e0db6acc850aa712c1858abb..5d73481c25761b1eaf2f329051d39bbff88c1929 100644 (file)
@@ -264,10 +264,7 @@ int do_commandx(struct nft_handle *h, int argc, char *argv[], char **table,
 
        h->ops->clear_cs(&cs);
 
-       free(args.s.addr.ptr);
-       free(args.s.mask.ptr);
-       free(args.d.addr.ptr);
-       free(args.d.mask.ptr);
+       xtables_clear_args(&args);
        xtables_free_opts(1);
 
        return ret;