File tree Expand file tree Collapse file tree 1 file changed +12
-2
lines changed Expand file tree Collapse file tree 1 file changed +12
-2
lines changed Original file line number Diff line number Diff line change @@ -1129,6 +1129,7 @@ static int iso_listen_bis(struct sock *sk)
11291129 return - EHOSTUNREACH ;
11301130
11311131 hci_dev_lock (hdev );
1132+ lock_sock (sk );
11321133
11331134 /* Fail if user set invalid QoS */
11341135 if (iso_pi (sk )-> qos_user_set && !check_bcast_qos (& iso_pi (sk )-> qos )) {
@@ -1159,6 +1160,7 @@ static int iso_listen_bis(struct sock *sk)
11591160 }
11601161
11611162unlock :
1163+ release_sock (sk );
11621164 hci_dev_unlock (hdev );
11631165 hci_dev_put (hdev );
11641166 return err ;
@@ -1187,6 +1189,7 @@ static int iso_sock_listen(struct socket *sock, int backlog)
11871189
11881190 BT_DBG ("sk %p backlog %d" , sk , backlog );
11891191
1192+ sock_hold (sk );
11901193 lock_sock (sk );
11911194
11921195 if (sk -> sk_state != BT_BOUND ) {
@@ -1199,10 +1202,16 @@ static int iso_sock_listen(struct socket *sock, int backlog)
11991202 goto done ;
12001203 }
12011204
1202- if (!bacmp (& iso_pi (sk )-> dst , BDADDR_ANY ))
1205+ if (!bacmp (& iso_pi (sk )-> dst , BDADDR_ANY )) {
12031206 err = iso_listen_cis (sk );
1204- else
1207+ } else {
1208+ /* Drop sock lock to avoid potential
1209+ * deadlock with the hdev lock.
1210+ */
1211+ release_sock (sk );
12051212 err = iso_listen_bis (sk );
1213+ lock_sock (sk );
1214+ }
12061215
12071216 if (err )
12081217 goto done ;
@@ -1214,6 +1223,7 @@ static int iso_sock_listen(struct socket *sock, int backlog)
12141223
12151224done :
12161225 release_sock (sk );
1226+ sock_put (sk );
12171227 return err ;
12181228}
12191229
You can’t perform that action at this time.
0 commit comments