diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 8 | 
1 files changed, 4 insertions, 4 deletions
| diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index ba09016d1bfd..d8841a2f1569 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -921,7 +921,8 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,  	}  	md5sig = rcu_dereference_protected(tp->md5sig_info, -					   sock_owned_by_user(sk)); +					   sock_owned_by_user(sk) || +					   lockdep_is_held(&sk->sk_lock.slock));  	if (!md5sig) {  		md5sig = kmalloc(sizeof(*md5sig), gfp);  		if (!md5sig) @@ -1492,7 +1493,7 @@ bool tcp_prequeue(struct sock *sk, struct sk_buff *skb)  	if (likely(sk->sk_rx_dst))  		skb_dst_drop(skb);  	else -		skb_dst_force(skb); +		skb_dst_force_safe(skb);  	__skb_queue_tail(&tp->ucopy.prequeue, skb);  	tp->ucopy.memory += skb->truesize; @@ -1720,8 +1721,7 @@ void inet_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)  {  	struct dst_entry *dst = skb_dst(skb); -	if (dst) { -		dst_hold(dst); +	if (dst && dst_hold_safe(dst)) {  		sk->sk_rx_dst = dst;  		inet_sk(sk)->rx_dst_ifindex = skb->skb_iif;  	} | 
