RE: [PATCH nf] Revert "netfilter: conntrack: fix bug in for_each_sctp_chunk"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Florian Westphal <fw@xxxxxxxxx>
> Sent: Thursday, 26 January 2023 02:35
> To: netfilter-devel@xxxxxxxxxxxxxxx
> Cc: Florian Westphal <fw@xxxxxxxxx>
> Subject: [PATCH nf] Revert "netfilter: conntrack: fix bug in
> for_each_sctp_chunk"
> 
> 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.
> 

Ah yes, perhaps your comment was for [1], where for_each_sctp_chunk() is used only once in nf_conntrack_sctp_packet(), and I didn't check for (sch)->length.
The (sch)->length check in do_basic_checks() was almost invisible to me :(

[1] https://patchwork.ozlabs.org/project/netfilter-devel/patch/20230111094640.24663-1-sriram.yagnaraman@xxxxxxxx/ 

> 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@xxxxxxxxx>
> ---
>  It might be a good idea to merge do_basic_checks and sctp_error  to avoid
> future patches adding for_each_sctp_chunk() earlier in the  pipeline.
> 
>  net/netfilter/nf_conntrack_proto_sctp.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/net/netfilter/nf_conntrack_proto_sctp.c
> b/net/netfilter/nf_conntrack_proto_sctp.c
> index 945dd40e7077..2f4459478750 100644
> --- a/net/netfilter/nf_conntrack_proto_sctp.c
> +++ b/net/netfilter/nf_conntrack_proto_sctp.c
> @@ -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 */
> --
> 2.39.1





[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux