]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/dccp/input.c
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
[karo-tx-linux.git] / net / dccp / input.c
index 8fedc2d497709b3dea9202894f45bf5cab043361..4a05d78768502df69275b4f91cb03bb2ada9f4c3 100644 (file)
@@ -577,6 +577,7 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
        struct dccp_sock *dp = dccp_sk(sk);
        struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
        const int old_state = sk->sk_state;
+       bool acceptable;
        int queued = 0;
 
        /*
@@ -603,8 +604,13 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
         */
        if (sk->sk_state == DCCP_LISTEN) {
                if (dh->dccph_type == DCCP_PKT_REQUEST) {
-                       if (inet_csk(sk)->icsk_af_ops->conn_request(sk,
-                                                                   skb) < 0)
+                       /* It is possible that we process SYN packets from backlog,
+                        * so we need to make sure to disable BH right there.
+                        */
+                       local_bh_disable();
+                       acceptable = inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) >= 0;
+                       local_bh_enable();
+                       if (!acceptable)
                                return 1;
                        consume_skb(skb);
                        return 0;