Revert "netfilter: conntrack: fix bug in for_each_sctp_chunk"
authorFlorian Westphal <fw@strlen.de>
Thu, 26 Jan 2023 01:35:21 +0000 (02:35 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 31 Jan 2023 13:02:48 +0000 (14:02 +0100)
There is no bug.  If sch->length == 0, this would result in an infinite
loop, but first caller, do_basic_checks(), errors out in this case.

After this change, packets with bogus zero-length chunks are no longer
detected as invalid, so revert & add comment wrt. 0 length check.

Fixes: 98ee00774525 ("netfilter: conntrack: fix bug in for_each_sctp_chunk")
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_conntrack_proto_sctp.c

index 945dd40e707731cd9a5c8b56de23507ed3a3a622..011d414038ea086b1df4f74829f461e5d3e065d0 100644 (file)
@@ -142,10 +142,11 @@ static void sctp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 }
 #endif
 
+/* do_basic_checks ensures sch->length > 0, do not use before */
 #define for_each_sctp_chunk(skb, sch, _sch, offset, dataoff, count)    \
 for ((offset) = (dataoff) + sizeof(struct sctphdr), (count) = 0;       \
-       ((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch))) && \
-       (sch)->length;  \
+       (offset) < (skb)->len &&                                        \
+       ((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch)));   \
        (offset) += (ntohs((sch)->length) + 3) & ~3, (count)++)
 
 /* Some validity checks to make sure the chunks are fine */