@@ -2834,7 +2834,7 @@ static void hci_cs_le_create_conn(struct hci_dev *hdev, u8 status)
28342834 bt_dev_dbg (hdev , "status 0x%2.2x" , status );
28352835
28362836 /* All connection failure handling is taken care of by the
2837- * hci_le_conn_failed function which is triggered by the HCI
2837+ * hci_conn_failed function which is triggered by the HCI
28382838 * request completion callbacks used for connecting.
28392839 */
28402840 if (status )
@@ -2859,7 +2859,7 @@ static void hci_cs_le_ext_create_conn(struct hci_dev *hdev, u8 status)
28592859 bt_dev_dbg (hdev , "status 0x%2.2x" , status );
28602860
28612861 /* All connection failure handling is taken care of by the
2862- * hci_le_conn_failed function which is triggered by the HCI
2862+ * hci_conn_failed function which is triggered by the HCI
28632863 * request completion callbacks used for connecting.
28642864 */
28652865 if (status )
@@ -3067,18 +3067,20 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,
30673067{
30683068 struct hci_ev_conn_complete * ev = data ;
30693069 struct hci_conn * conn ;
3070+ u8 status = ev -> status ;
30703071
3071- if (__le16_to_cpu (ev -> handle ) > HCI_CONN_HANDLE_MAX ) {
3072- bt_dev_err (hdev , "Ignoring HCI_Connection_Complete for invalid handle" );
3073- return ;
3074- }
3075-
3076- bt_dev_dbg (hdev , "status 0x%2.2x" , ev -> status );
3072+ bt_dev_dbg (hdev , "status 0x%2.2x" , status );
30773073
30783074 hci_dev_lock (hdev );
30793075
30803076 conn = hci_conn_hash_lookup_ba (hdev , ev -> link_type , & ev -> bdaddr );
30813077 if (!conn ) {
3078+ /* In case of error status and there is no connection pending
3079+ * just unlock as there is nothing to cleanup.
3080+ */
3081+ if (ev -> status )
3082+ goto unlock ;
3083+
30823084 /* Connection may not exist if auto-connected. Check the bredr
30833085 * allowlist to see if this device is allowed to auto connect.
30843086 * If link is an ACL type, create a connection class
@@ -3122,8 +3124,14 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,
31223124 goto unlock ;
31233125 }
31243126
3125- if (!ev -> status ) {
3127+ if (!status ) {
31263128 conn -> handle = __le16_to_cpu (ev -> handle );
3129+ if (conn -> handle > HCI_CONN_HANDLE_MAX ) {
3130+ bt_dev_err (hdev , "Invalid handle: 0x%4.4x > 0x%4.4x" ,
3131+ conn -> handle , HCI_CONN_HANDLE_MAX );
3132+ status = HCI_ERROR_INVALID_PARAMETERS ;
3133+ goto done ;
3134+ }
31273135
31283136 if (conn -> type == ACL_LINK ) {
31293137 conn -> state = BT_CONFIG ;
@@ -3164,19 +3172,14 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,
31643172 hci_send_cmd (hdev , HCI_OP_CHANGE_CONN_PTYPE , sizeof (cp ),
31653173 & cp );
31663174 }
3167- } else {
3168- conn -> state = BT_CLOSED ;
3169- if (conn -> type == ACL_LINK )
3170- mgmt_connect_failed (hdev , & conn -> dst , conn -> type ,
3171- conn -> dst_type , ev -> status );
31723175 }
31733176
31743177 if (conn -> type == ACL_LINK )
31753178 hci_sco_setup (conn , ev -> status );
31763179
3177- if ( ev -> status ) {
3178- hci_connect_cfm ( conn , ev -> status );
3179- hci_conn_del (conn );
3180+ done :
3181+ if ( status ) {
3182+ hci_conn_failed (conn , status );
31803183 } else if (ev -> link_type == SCO_LINK ) {
31813184 switch (conn -> setting & SCO_AIRMODE_MASK ) {
31823185 case SCO_AIRMODE_CVSD :
@@ -3185,7 +3188,7 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,
31853188 break ;
31863189 }
31873190
3188- hci_connect_cfm (conn , ev -> status );
3191+ hci_connect_cfm (conn , status );
31893192 }
31903193
31913194unlock :
@@ -4676,6 +4679,7 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev, void *data,
46764679{
46774680 struct hci_ev_sync_conn_complete * ev = data ;
46784681 struct hci_conn * conn ;
4682+ u8 status = ev -> status ;
46794683
46804684 switch (ev -> link_type ) {
46814685 case SCO_LINK :
@@ -4690,12 +4694,7 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev, void *data,
46904694 return ;
46914695 }
46924696
4693- if (__le16_to_cpu (ev -> handle ) > HCI_CONN_HANDLE_MAX ) {
4694- bt_dev_err (hdev , "Ignoring HCI_Sync_Conn_Complete for invalid handle" );
4695- return ;
4696- }
4697-
4698- bt_dev_dbg (hdev , "status 0x%2.2x" , ev -> status );
4697+ bt_dev_dbg (hdev , "status 0x%2.2x" , status );
46994698
47004699 hci_dev_lock (hdev );
47014700
@@ -4729,9 +4728,17 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev, void *data,
47294728 goto unlock ;
47304729 }
47314730
4732- switch (ev -> status ) {
4731+ switch (status ) {
47334732 case 0x00 :
47344733 conn -> handle = __le16_to_cpu (ev -> handle );
4734+ if (conn -> handle > HCI_CONN_HANDLE_MAX ) {
4735+ bt_dev_err (hdev , "Invalid handle: 0x%4.4x > 0x%4.4x" ,
4736+ conn -> handle , HCI_CONN_HANDLE_MAX );
4737+ status = HCI_ERROR_INVALID_PARAMETERS ;
4738+ conn -> state = BT_CLOSED ;
4739+ break ;
4740+ }
4741+
47354742 conn -> state = BT_CONNECTED ;
47364743 conn -> type = ev -> link_type ;
47374744
@@ -4775,8 +4782,8 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev, void *data,
47754782 }
47764783 }
47774784
4778- hci_connect_cfm (conn , ev -> status );
4779- if (ev -> status )
4785+ hci_connect_cfm (conn , status );
4786+ if (status )
47804787 hci_conn_del (conn );
47814788
47824789unlock :
@@ -5527,11 +5534,6 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
55275534 struct smp_irk * irk ;
55285535 u8 addr_type ;
55295536
5530- if (handle > HCI_CONN_HANDLE_MAX ) {
5531- bt_dev_err (hdev , "Ignoring HCI_LE_Connection_Complete for invalid handle" );
5532- return ;
5533- }
5534-
55355537 hci_dev_lock (hdev );
55365538
55375539 /* All controllers implicitly stop advertising in the event of a
@@ -5541,6 +5543,12 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
55415543
55425544 conn = hci_lookup_le_connect (hdev );
55435545 if (!conn ) {
5546+ /* In case of error status and there is no connection pending
5547+ * just unlock as there is nothing to cleanup.
5548+ */
5549+ if (status )
5550+ goto unlock ;
5551+
55445552 conn = hci_conn_add (hdev , LE_LINK , bdaddr , role );
55455553 if (!conn ) {
55465554 bt_dev_err (hdev , "no memory for new connection" );
@@ -5603,8 +5611,14 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
56035611
56045612 conn -> dst_type = ev_bdaddr_type (hdev , conn -> dst_type , NULL );
56055613
5614+ if (handle > HCI_CONN_HANDLE_MAX ) {
5615+ bt_dev_err (hdev , "Invalid handle: 0x%4.4x > 0x%4.4x" , handle ,
5616+ HCI_CONN_HANDLE_MAX );
5617+ status = HCI_ERROR_INVALID_PARAMETERS ;
5618+ }
5619+
56065620 if (status ) {
5607- hci_le_conn_failed (conn , status );
5621+ hci_conn_failed (conn , status );
56085622 goto unlock ;
56095623 }
56105624
0 commit comments