diff options
Diffstat (limited to 'net/bluetooth/l2cap_sock.c')
| -rw-r--r-- | net/bluetooth/l2cap_sock.c | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 1842141baedb..a8ba752732c9 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -1019,7 +1019,7 @@ static int l2cap_sock_recvmsg(struct socket *sock, struct msghdr *msg,  		goto done;  	if (pi->rx_busy_skb) { -		if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb)) +		if (!__sock_queue_rcv_skb(sk, pi->rx_busy_skb))  			pi->rx_busy_skb = NULL;  		else  			goto done; @@ -1270,7 +1270,17 @@ static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)  		goto done;  	} -	err = sock_queue_rcv_skb(sk, skb); +	if (chan->mode != L2CAP_MODE_ERTM && +	    chan->mode != L2CAP_MODE_STREAMING) { +		/* Even if no filter is attached, we could potentially +		 * get errors from security modules, etc. +		 */ +		err = sk_filter(sk, skb); +		if (err) +			goto done; +	} + +	err = __sock_queue_rcv_skb(sk, skb);  	/* For ERTM, handle one skb that doesn't fit into the recv  	 * buffer.  This is important to do because the data frames  | 
