|
@@ -1355,7 +1355,7 @@ static struct sock *tcp_v4_cookie_check(struct sock *sk, struct sk_buff *skb)
|
|
|
}
|
|
|
|
|
|
/* The socket must have it's spinlock held when we get
|
|
|
- * here.
|
|
|
+ * here, unless it is a TCP_LISTEN socket.
|
|
|
*
|
|
|
* We have a potential double-lock case here, so even when
|
|
|
* doing backlog processing we use the BH locking scheme.
|
|
@@ -1619,9 +1619,15 @@ process:
|
|
|
if (sk_filter(sk, skb))
|
|
|
goto discard_and_relse;
|
|
|
|
|
|
- sk_incoming_cpu_update(sk);
|
|
|
skb->dev = NULL;
|
|
|
|
|
|
+ if (sk->sk_state == TCP_LISTEN) {
|
|
|
+ ret = tcp_v4_do_rcv(sk, skb);
|
|
|
+ goto put_and_return;
|
|
|
+ }
|
|
|
+
|
|
|
+ sk_incoming_cpu_update(sk);
|
|
|
+
|
|
|
bh_lock_sock_nested(sk);
|
|
|
tcp_sk(sk)->segs_in += max_t(u16, 1, skb_shinfo(skb)->gso_segs);
|
|
|
ret = 0;
|
|
@@ -1636,6 +1642,7 @@ process:
|
|
|
}
|
|
|
bh_unlock_sock(sk);
|
|
|
|
|
|
+put_and_return:
|
|
|
sock_put(sk);
|
|
|
|
|
|
return ret;
|