|
@@ -606,11 +606,13 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
|
|
if (sk->sk_state == DCCP_LISTEN) {
|
|
if (sk->sk_state == DCCP_LISTEN) {
|
|
if (dh->dccph_type == DCCP_PKT_REQUEST) {
|
|
if (dh->dccph_type == DCCP_PKT_REQUEST) {
|
|
/* It is possible that we process SYN packets from backlog,
|
|
/* It is possible that we process SYN packets from backlog,
|
|
- * so we need to make sure to disable BH right there.
|
|
|
|
|
|
+ * so we need to make sure to disable BH and RCU right there.
|
|
*/
|
|
*/
|
|
|
|
+ rcu_read_lock();
|
|
local_bh_disable();
|
|
local_bh_disable();
|
|
acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0;
|
|
acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0;
|
|
local_bh_enable();
|
|
local_bh_enable();
|
|
|
|
+ rcu_read_unlock();
|
|
if (!acceptable)
|
|
if (!acceptable)
|
|
return 1;
|
|
return 1;
|
|
consume_skb(skb);
|
|
consume_skb(skb);
|