@@ -747,7 +747,7 @@ static void l2cap_br_conn_req(struct bt_l2cap_br *l2cap, uint8_t ident,
747
747
struct bt_l2cap_chan * chan ;
748
748
struct bt_l2cap_server * server ;
749
749
struct bt_l2cap_conn_req * req = (void * )buf -> data ;
750
- uint16_t psm , scid , dcid , result ;
750
+ uint16_t psm , scid , result ;
751
751
752
752
if (buf -> len < sizeof (* req )) {
753
753
BT_ERR ("Too small L2CAP conn req packet size" );
@@ -756,15 +756,14 @@ static void l2cap_br_conn_req(struct bt_l2cap_br *l2cap, uint8_t ident,
756
756
757
757
psm = sys_le16_to_cpu (req -> psm );
758
758
scid = sys_le16_to_cpu (req -> scid );
759
- dcid = 0 ;
760
759
761
760
BT_DBG ("psm 0x%02x scid 0x%04x" , psm , scid );
762
761
763
762
/* Check if there is a server registered */
764
763
server = l2cap_br_server_lookup_psm (psm );
765
764
if (!server ) {
766
765
result = BT_L2CAP_BR_ERR_PSM_NOT_SUPP ;
767
- goto done ;
766
+ goto no_chan ;
768
767
}
769
768
770
769
/*
@@ -774,18 +773,23 @@ static void l2cap_br_conn_req(struct bt_l2cap_br *l2cap, uint8_t ident,
774
773
if (server -> sec_level != BT_SECURITY_NONE &&
775
774
BT_FEAT_HOST_SSP (conn -> br .features ) && !conn -> encrypt ) {
776
775
result = BT_L2CAP_BR_ERR_SEC_BLOCK ;
777
- goto done ;
776
+ goto no_chan ;
778
777
}
779
778
780
779
if (!L2CAP_BR_CID_IS_DYN (scid )) {
781
780
result = BT_L2CAP_BR_ERR_INVALID_SCID ;
782
- goto done ;
781
+ goto no_chan ;
783
782
}
784
783
785
784
chan = bt_l2cap_br_lookup_tx_cid (conn , scid );
786
785
if (chan ) {
786
+ /*
787
+ * we have a chan here but this is due to SCID being already in
788
+ * use so it is not channel we are suppose to pass to
789
+ * l2cap_br_conn_req_reply as wrong DCID would be used
790
+ */
787
791
result = BT_L2CAP_BR_ERR_SCID_IN_USE ;
788
- goto done ;
792
+ goto no_chan ;
789
793
}
790
794
791
795
/*
@@ -794,16 +798,14 @@ static void l2cap_br_conn_req(struct bt_l2cap_br *l2cap, uint8_t ident,
794
798
* proper result and quit since chan pointer is uninitialized then.
795
799
*/
796
800
if (server -> accept (conn , & chan ) < 0 ) {
797
- l2cap_br_send_conn_rsp (conn , scid , dcid , ident ,
798
- BT_L2CAP_BR_ERR_NO_RESOURCES );
799
- return ;
801
+ result = BT_L2CAP_BR_ERR_NO_RESOURCES ;
802
+ goto no_chan ;
800
803
}
801
804
802
805
chan -> required_sec_level = server -> sec_level ;
803
806
804
807
l2cap_br_chan_add (conn , chan , l2cap_br_chan_destroy );
805
808
BR_CHAN (chan )-> tx .cid = scid ;
806
- dcid = BR_CHAN (chan )-> rx .cid ;
807
809
chan -> ident = ident ;
808
810
bt_l2cap_chan_set_state (chan , BT_L2CAP_CONNECT );
809
811
atomic_set_bit (BR_CHAN (chan )-> flags , L2CAP_FLAG_CONN_ACCEPTOR );
@@ -824,20 +826,25 @@ static void l2cap_br_conn_req(struct bt_l2cap_br *l2cap, uint8_t ident,
824
826
result = BT_L2CAP_BR_ERR_SEC_BLOCK ;
825
827
break ;
826
828
}
827
- done :
828
829
/* Reply on connection request as acceptor */
829
830
l2cap_br_conn_req_reply (chan , result );
830
831
831
- /* Disconnect link when security rules were violated */
832
- if (result == BT_L2CAP_BR_ERR_SEC_BLOCK ) {
833
- bt_conn_disconnect (conn , BT_HCI_ERR_AUTHENTICATION_FAIL );
832
+ if (result != BT_L2CAP_SUCCESS ) {
833
+ /* Disconnect link when security rules were violated */
834
+ if (result == BT_L2CAP_BR_ERR_SEC_BLOCK ) {
835
+ bt_conn_disconnect (conn ,
836
+ BT_HCI_ERR_AUTHENTICATION_FAIL );
837
+ }
838
+
834
839
return ;
835
840
}
836
841
837
- if (result == BT_L2CAP_SUCCESS ) {
838
- bt_l2cap_chan_set_state (chan , BT_L2CAP_CONFIG );
839
- l2cap_br_conf (chan );
840
- }
842
+ bt_l2cap_chan_set_state (chan , BT_L2CAP_CONFIG );
843
+ l2cap_br_conf (chan );
844
+ return ;
845
+
846
+ no_chan :
847
+ l2cap_br_send_conn_rsp (conn , scid , 0 , ident , result );
841
848
}
842
849
843
850
static void l2cap_br_conf_rsp (struct bt_l2cap_br * l2cap , uint8_t ident ,
0 commit comments