Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19f8def0 authored by Waldemar Rymarkiewicz's avatar Waldemar Rymarkiewicz Committed by Gustavo Padovan
Browse files

Bluetooth: Fix auth_complete_evt for legacy units



Legacy devices don't re-authenticate the link properly if a link key
already exists.  Thus, don't update sec_level for this case even if
hci_auth_complete_evt indicates success. Otherwise the sec_level will
not reflect a real security on the link.

Signed-off-by: default avatarWaldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 35815085
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -322,6 +322,7 @@ void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data);
/* ----- HCI Connections ----- */
/* ----- HCI Connections ----- */
enum {
enum {
	HCI_CONN_AUTH_PEND,
	HCI_CONN_AUTH_PEND,
	HCI_CONN_REAUTH_PEND,
	HCI_CONN_ENCRYPT_PEND,
	HCI_CONN_ENCRYPT_PEND,
	HCI_CONN_RSWITCH_PEND,
	HCI_CONN_RSWITCH_PEND,
	HCI_CONN_MODE_CHANGE_PEND,
	HCI_CONN_MODE_CHANGE_PEND,
+2 −0
Original line number Original line Diff line number Diff line
@@ -548,6 +548,8 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
		cp.handle = cpu_to_le16(conn->handle);
		cp.handle = cpu_to_le16(conn->handle);
		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
							sizeof(cp), &cp);
							sizeof(cp), &cp);
		if (conn->key_type != 0xff)
			set_bit(HCI_CONN_REAUTH_PEND, &conn->pend);
	}
	}


	return 0;
	return 0;
+10 −2
Original line number Original line Diff line number Diff line
@@ -1489,13 +1489,21 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s
	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
	if (conn) {
	if (conn) {
		if (!ev->status) {
		if (!ev->status) {
			if (!(conn->ssp_mode > 0 && hdev->ssp_mode > 0) &&
						test_bit(HCI_CONN_REAUTH_PEND,
						&conn->pend)) {
				BT_INFO("re-auth of legacy device is not"
								"possible.");
			} else {
				conn->link_mode |= HCI_LM_AUTH;
				conn->link_mode |= HCI_LM_AUTH;
				conn->sec_level = conn->pending_sec_level;
				conn->sec_level = conn->pending_sec_level;
			}
		} else {
		} else {
			mgmt_auth_failed(hdev->id, &conn->dst, ev->status);
			mgmt_auth_failed(hdev->id, &conn->dst, ev->status);
		}
		}


		clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
		clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
		clear_bit(HCI_CONN_REAUTH_PEND, &conn->pend);


		if (conn->state == BT_CONFIG) {
		if (conn->state == BT_CONFIG) {
			if (!ev->status && hdev->ssp_mode > 0 &&
			if (!ev->status && hdev->ssp_mode > 0 &&