Re: [PATCH nf] netfilter: nft_exthdr: Fix non-linear header modification

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

 



Xiao Liang <shaw.leon@xxxxxxxxx> wrote:
> nft_tcp_header_pointer() may copy TCP header if it's not linear.
> In that case, we should modify the packet rather than the buffer, after
> proper skb_ensure_writable().

Fixes: 99d1712bc41c ("netfilter: exthdr: tcp option set support")

I do not understand this changelog.

The bug is that skb_ensure_writable() size is too small, hence
nft_tcp_header_pointer() may return a pointer to local stack
buffer.

> Signed-off-by: Xiao Liang <shaw.leon@xxxxxxxxx>
> ---
>  net/netfilter/nft_exthdr.c | 15 +++++++--------
>  1 file changed, 7 insertions(+), 8 deletions(-)
> 
> diff --git a/net/netfilter/nft_exthdr.c b/net/netfilter/nft_exthdr.c
> index 7f856ceb3a66..2189ccc1119c 100644
> --- a/net/netfilter/nft_exthdr.c
> +++ b/net/netfilter/nft_exthdr.c
> @@ -254,13 +254,12 @@ static void nft_exthdr_tcp_set_eval(const struct nft_expr *expr,
>  			goto err;
>  
>  		if (skb_ensure_writable(pkt->skb,
> -					nft_thoff(pkt) + i + priv->len))
> +					nft_thoff(pkt) + i + priv->offset +
> +					priv->len))

[..]

> -		tcph = nft_tcp_header_pointer(pkt, sizeof(buff), buff,
> -					      &tcphdr_len);
> -		if (!tcph)
> -			goto err;
> +		tcph = (struct tcphdr *)(pkt->skb->data + nft_thoff(pkt));
> +		opt = (u8 *)tcph;

This modification is not related to the bug?

If you think this is better, then please say that the 'do not use
nft_tcp_header_pointer' is an unrelated cleanup in the commit message.

But I would prefer to not mix functional and non-functional changes.
Also, the use of the nft_tcp_header_pointer() helper is the reason why
this doesn't result in memory corruption.

> @@ -325,9 +324,9 @@ static void nft_exthdr_tcp_strip_eval(const struct nft_expr *expr,
>  	if (skb_ensure_writable(pkt->skb, nft_thoff(pkt) + tcphdr_len))

Just use the above in nft_exthdr_tcp_set_eval and place it before the loop?



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

  Powered by Linux