diff options
Diffstat (limited to 'net/bluetooth')
| -rw-r--r-- | net/bluetooth/hci_core.c | 8 | ||||
| -rw-r--r-- | net/bluetooth/hci_event.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/hidp/core.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 11 | ||||
| -rw-r--r-- | net/bluetooth/sco.c | 2 | 
5 files changed, 14 insertions, 11 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 596660d37c5..0f78e34220c 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2810,14 +2810,6 @@ static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)  	if (conn) {  		hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); -		hci_dev_lock(hdev); -		if (test_bit(HCI_MGMT, &hdev->dev_flags) && -		    !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) -			mgmt_device_connected(hdev, &conn->dst, conn->type, -					      conn->dst_type, 0, NULL, 0, -					      conn->dev_class); -		hci_dev_unlock(hdev); -  		/* Send to upper protocol */  		l2cap_recv_acldata(conn, skb, flags);  		return; diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 705078a0cc3..81b44481d0d 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -2688,7 +2688,7 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)  	if (ev->opcode != HCI_OP_NOP)  		del_timer(&hdev->cmd_timer); -	if (ev->ncmd) { +	if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {  		atomic_set(&hdev->cmd_cnt, 1);  		if (!skb_queue_empty(&hdev->cmd_q))  			queue_work(hdev->workqueue, &hdev->cmd_work); diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index b2bcbe2dc32..a7352ff3fd1 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c @@ -931,7 +931,7 @@ static int hidp_setup_hid(struct hidp_session *session,  	hid->version = req->version;  	hid->country = req->country; -	strncpy(hid->name, req->name, 128); +	strncpy(hid->name, req->name, sizeof(req->name) - 1);  	snprintf(hid->phys, sizeof(hid->phys), "%pMR",  		 &bt_sk(session->ctrl_sock->sk)->src); diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 2c78208d793..22e65832284 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -3727,6 +3727,17 @@ sendresp:  static int l2cap_connect_req(struct l2cap_conn *conn,  			     struct l2cap_cmd_hdr *cmd, u8 *data)  { +	struct hci_dev *hdev = conn->hcon->hdev; +	struct hci_conn *hcon = conn->hcon; + +	hci_dev_lock(hdev); +	if (test_bit(HCI_MGMT, &hdev->dev_flags) && +	    !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags)) +		mgmt_device_connected(hdev, &hcon->dst, hcon->type, +				      hcon->dst_type, 0, NULL, 0, +				      hcon->dev_class); +	hci_dev_unlock(hdev); +  	l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0);  	return 0;  } diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 531a93d613d..57f250c20e3 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -352,7 +352,7 @@ static void __sco_sock_close(struct sock *sk)  	case BT_CONNECTED:  	case BT_CONFIG: -		if (sco_pi(sk)->conn) { +		if (sco_pi(sk)->conn->hcon) {  			sk->sk_state = BT_DISCONN;  			sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT);  			hci_conn_put(sco_pi(sk)->conn->hcon);  |