summaryrefslogtreecommitdiffstats
path: root/src/proto.c
diff options
context:
space:
mode:
authorJeremy Sowden <jeremy@azazel.net>2021-12-11 18:55:23 +0000
committerPablo Neira Ayuso <pablo@netfilter.org>2021-12-15 22:49:50 +0100
commit1239804fa06f346b10c9b36773812d7e0fa9aa7c (patch)
tree7c2a4dc6111b367adb14e8f9acf4b97ebbcb629d /src/proto.c
parentb2591d4b13ab95240216a93d682b842c28b2b884 (diff)
proto: short-circuit loops over upper protocols
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>
Diffstat (limited to 'src/proto.c')
-rw-r--r--src/proto.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/proto.c b/src/proto.c
index fe58c83a..31a2f380 100644
--- a/src/proto.c
+++ b/src/proto.c
@@ -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;