mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: Waldemar Rymarkiewicz <waldemar.rymarkiewicz@tieto.com> Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
This commit is contained in:
		
							parent
							
								
									3581508571
								
							
						
					
					
						commit
						19f8def031
					
				
					 3 changed files with 13 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -322,6 +322,7 @@ void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data);
 | 
			
		|||
/* ----- HCI Connections ----- */
 | 
			
		||||
enum {
 | 
			
		||||
	HCI_CONN_AUTH_PEND,
 | 
			
		||||
	HCI_CONN_REAUTH_PEND,
 | 
			
		||||
	HCI_CONN_ENCRYPT_PEND,
 | 
			
		||||
	HCI_CONN_RSWITCH_PEND,
 | 
			
		||||
	HCI_CONN_MODE_CHANGE_PEND,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
 | 
			
		||||
							sizeof(cp), &cp);
 | 
			
		||||
		if (conn->key_type != 0xff)
 | 
			
		||||
			set_bit(HCI_CONN_REAUTH_PEND, &conn->pend);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
	if (conn) {
 | 
			
		||||
		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->sec_level = conn->pending_sec_level;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			mgmt_auth_failed(hdev->id, &conn->dst, ev->status);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
 | 
			
		||||
		clear_bit(HCI_CONN_REAUTH_PEND, &conn->pend);
 | 
			
		||||
 | 
			
		||||
		if (conn->state == BT_CONFIG) {
 | 
			
		||||
			if (!ev->status && hdev->ssp_mode > 0 &&
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue