diff options
Diffstat (limited to 'net/ipv4/tcp.c')
| -rw-r--r-- | net/ipv4/tcp.c | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index b7796b4cf0a0..2bb28bfd83bf 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -1758,6 +1758,9 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,  {  	skb_frag_t *frag; +	if (unlikely(offset_skb >= skb->len)) +		return NULL; +  	offset_skb -= skb_headlen(skb);  	if ((int)offset_skb < 0 || skb_has_frag_list(skb))  		return NULL; @@ -3009,8 +3012,7 @@ int tcp_disconnect(struct sock *sk, int flags)  	icsk->icsk_ack.rcv_mss = TCP_MIN_MSS;  	memset(&tp->rx_opt, 0, sizeof(tp->rx_opt));  	__sk_dst_reset(sk); -	dst_release(sk->sk_rx_dst); -	sk->sk_rx_dst = NULL; +	dst_release(xchg((__force struct dst_entry **)&sk->sk_rx_dst, NULL));  	tcp_saved_syn_free(tp);  	tp->compressed_ack = 0;  	tp->segs_in = 0; |