diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 0c50c5a32b84..a22ee5838751 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1907,7 +1907,6 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)  		return 0;  	} -	reason = SKB_DROP_REASON_NOT_SPECIFIED;  	if (tcp_checksum_complete(skb))  		goto csum_err; @@ -1915,9 +1914,10 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)  		struct sock *nsk = tcp_v4_cookie_check(sk, skb);  		if (!nsk) -			goto discard; +			return 0;  		if (nsk != sk) { -			if (tcp_child_process(sk, nsk, skb)) { +			reason = tcp_child_process(sk, nsk, skb); +			if (reason) {  				rsk = nsk;  				goto reset;  			} @@ -1926,7 +1926,8 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)  	} else  		sock_rps_save_rxhash(sk, skb); -	if (tcp_rcv_state_process(sk, skb)) { +	reason = tcp_rcv_state_process(sk, skb); +	if (reason) {  		rsk = sk;  		goto reset;  	} @@ -2275,10 +2276,12 @@ process:  		if (nsk == sk) {  			reqsk_put(req);  			tcp_v4_restore_cb(skb); -		} else if (tcp_child_process(sk, nsk, skb)) { -			tcp_v4_send_reset(nsk, skb); -			goto discard_and_relse;  		} else { +			drop_reason = tcp_child_process(sk, nsk, skb); +			if (drop_reason) { +				tcp_v4_send_reset(nsk, skb); +				goto discard_and_relse; +			}  			sock_put(sk);  			return 0;  		}  | 
