netfilter: conntrack: fix bug in for_each_sctp_chunk
authorSriram Yagnaraman <sriram.yagnaraman@est.tech>
Tue, 24 Jan 2023 01:47:19 +0000 (02:47 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 24 Jan 2023 08:52:31 +0000 (09:52 +0100)
skb_header_pointer() will return NULL if offset + sizeof(_sch) exceeds
skb->len, so this offset < skb->len test is redundant.

if sch->length == 0, this will end up in an infinite loop, add a check
for sch->length > 0

Fixes: 9fb9cbb1082d ("[NETFILTER]: Add nf_conntrack subsystem.")
Suggested-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Sriram Yagnaraman <sriram.yagnaraman@est.tech>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_conntrack_proto_sctp.c

index 2b2c549ba6789021b3efe3013de37f0e1dbddb62..c561c1213704fd207d4c582dd5695895dcdff936 100644 (file)
@@ -160,8 +160,8 @@ static void sctp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 
 #define for_each_sctp_chunk(skb, sch, _sch, offset, dataoff, count)    \
 for ((offset) = (dataoff) + sizeof(struct sctphdr), (count) = 0;       \
-       (offset) < (skb)->len &&                                        \
-       ((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch)));   \
+       ((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch))) && \
+       (sch)->length;  \
        (offset) += (ntohs((sch)->length) + 3) & ~3, (count)++)
 
 /* Some validity checks to make sure the chunks are fine */