]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
proto: short-circuit loops over upper protocols
authorJeremy Sowden <jeremy@azazel.net>
Sat, 11 Dec 2021 18:55:23 +0000 (18:55 +0000)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 15 Dec 2021 21:49:50 +0000 (22:49 +0100)
Each `struct proto_desc` contains a fixed-size array of higher layer
protocols.  Only the first few are not NULL.  Therefore, we can stop
iterating over the array once we reach a NULL member.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/proto.c

index fe58c83a92955a23a148cbd8fa2f7db7bcb27b70..31a2f38065ad4b7696e512a99f6db1929f2032b4 100644 (file)
@@ -59,7 +59,8 @@ proto_find_upper(const struct proto_desc *base, unsigned int num)
 {
        unsigned int i;
 
-       for (i = 0; i < array_size(base->protocols); i++) {
+       for (i = 0; i < array_size(base->protocols) && base->protocols[i].desc;
+            i++) {
                if (base->protocols[i].num == num)
                        return base->protocols[i].desc;
        }
@@ -77,7 +78,8 @@ int proto_find_num(const struct proto_desc *base,
 {
        unsigned int i;
 
-       for (i = 0; i < array_size(base->protocols); i++) {
+       for (i = 0; i < array_size(base->protocols) && base->protocols[i].desc;
+            i++) {
                if (base->protocols[i].desc == desc)
                        return base->protocols[i].num;
        }
@@ -105,7 +107,9 @@ int proto_dev_type(const struct proto_desc *desc, uint16_t *res)
                        *res = dev_proto_desc[i].type;
                        return 0;
                }
-               for (j = 0; j < array_size(base->protocols); j++) {
+               for (j = 0; j < array_size(base->protocols) &&
+                            base->protocols[j].desc;
+                    j++) {
                        if (base->protocols[j].desc == desc) {
                                *res = dev_proto_desc[i].type;
                                return 0;