diff options
Diffstat (limited to 'net/dccp/input.c')
-rw-r--r-- | net/dccp/input.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/net/dccp/input.c b/net/dccp/input.c index d28d46bff6ab..85d6c879383d 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
@@ -606,11 +606,13 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
606 | if (sk->sk_state == DCCP_LISTEN) { | 606 | if (sk->sk_state == DCCP_LISTEN) { |
607 | if (dh->dccph_type == DCCP_PKT_REQUEST) { | 607 | if (dh->dccph_type == DCCP_PKT_REQUEST) { |
608 | /* It is possible that we process SYN packets from backlog, | 608 | /* It is possible that we process SYN packets from backlog, |
609 | * so we need to make sure to disable BH right there. | 609 | * so we need to make sure to disable BH and RCU right there. |
610 | */ | 610 | */ |
611 | rcu_read_lock(); | ||
611 | local_bh_disable(); | 612 | local_bh_disable(); |
612 | acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0; | 613 | acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0; |
613 | local_bh_enable(); | 614 | local_bh_enable(); |
615 | rcu_read_unlock(); | ||
614 | if (!acceptable) | 616 | if (!acceptable) |
615 | return 1; | 617 | return 1; |
616 | consume_skb(skb); | 618 | consume_skb(skb); |