diff options
Diffstat (limited to 'net/bluetooth/l2cap.c')
| -rw-r--r-- | net/bluetooth/l2cap.c | 14 | 
1 files changed, 11 insertions, 3 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 1b682a5aa061..cf3c4073a8a6 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c @@ -401,6 +401,11 @@ static inline void l2cap_send_rr_or_rnr(struct l2cap_pinfo *pi, u16 control)  	l2cap_send_sframe(pi, control);  } +static inline int __l2cap_no_conn_pending(struct sock *sk) +{ +	return !(l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND); +} +  static void l2cap_do_start(struct sock *sk)  {  	struct l2cap_conn *conn = l2cap_pi(sk)->conn; @@ -409,12 +414,13 @@ static void l2cap_do_start(struct sock *sk)  		if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE))  			return; -		if (l2cap_check_security(sk)) { +		if (l2cap_check_security(sk) && __l2cap_no_conn_pending(sk)) {  			struct l2cap_conn_req req;  			req.scid = cpu_to_le16(l2cap_pi(sk)->scid);  			req.psm  = l2cap_pi(sk)->psm;  			l2cap_pi(sk)->ident = l2cap_get_ident(conn); +			l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;  			l2cap_send_cmd(conn, l2cap_pi(sk)->ident,  					L2CAP_CONN_REQ, sizeof(req), &req); @@ -464,12 +470,14 @@ static void l2cap_conn_start(struct l2cap_conn *conn)  		}  		if (sk->sk_state == BT_CONNECT) { -			if (l2cap_check_security(sk)) { +			if (l2cap_check_security(sk) && +					__l2cap_no_conn_pending(sk)) {  				struct l2cap_conn_req req;  				req.scid = cpu_to_le16(l2cap_pi(sk)->scid);  				req.psm  = l2cap_pi(sk)->psm;  				l2cap_pi(sk)->ident = l2cap_get_ident(conn); +				l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;  				l2cap_send_cmd(conn, l2cap_pi(sk)->ident,  					L2CAP_CONN_REQ, sizeof(req), &req); @@ -2912,7 +2920,6 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd  		l2cap_pi(sk)->ident = 0;  		l2cap_pi(sk)->dcid = dcid;  		l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; -  		l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND;  		l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, @@ -4404,6 +4411,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)  				req.psm  = l2cap_pi(sk)->psm;  				l2cap_pi(sk)->ident = l2cap_get_ident(conn); +				l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND;  				l2cap_send_cmd(conn, l2cap_pi(sk)->ident,  					L2CAP_CONN_REQ, sizeof(req), &req);  |