]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
netlink: quick sort array of devices
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 8 Jun 2021 12:48:20 +0000 (14:48 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 8 Jun 2021 16:33:04 +0000 (18:33 +0200)
Provide an ordered list of devices for (netdev) chain and flowtable.

Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1525
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/netlink.c

index 6b6fe27762d5ab5b48d67b9381a220b0e867c5c8..e91b06e3ea971ac221e75beaa79ccf8805462d5b 100644 (file)
@@ -517,6 +517,14 @@ static int chain_parse_udata_cb(const struct nftnl_udata *attr, void *data)
        return 0;
 }
 
+static int qsort_device_cmp(const void *a, const void *b)
+{
+       const char **x = (const char **)a;
+       const char **y = (const char **)b;
+
+       return strcmp(*x, *y);
+}
+
 struct chain *netlink_delinearize_chain(struct netlink_ctx *ctx,
                                        const struct nftnl_chain *nlc)
 {
@@ -580,6 +588,11 @@ struct chain *netlink_delinearize_chain(struct netlink_ctx *ctx,
                        chain->dev_array_len = len;
                }
                chain->flags        |= CHAIN_F_BASECHAIN;
+
+               if (chain->dev_array_len) {
+                       qsort(chain->dev_array, chain->dev_array_len,
+                             sizeof(char *), qsort_device_cmp);
+               }
        }
 
        if (nftnl_chain_is_set(nlc, NFTNL_CHAIN_USERDATA)) {
@@ -1582,6 +1595,11 @@ netlink_delinearize_flowtable(struct netlink_ctx *ctx,
 
        flowtable->dev_array_len = len;
 
+       if (flowtable->dev_array_len) {
+               qsort(flowtable->dev_array, flowtable->dev_array_len,
+                     sizeof(char *), qsort_device_cmp);
+       }
+
        priority = nftnl_flowtable_get_u32(nlo, NFTNL_FLOWTABLE_PRIO);
        flowtable->priority.expr =
                                constant_expr_alloc(&netlink_location,