File tree 1 file changed +12
-2
lines changed
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)
1129
1129
return - EHOSTUNREACH ;
1130
1130
1131
1131
hci_dev_lock (hdev );
1132
+ lock_sock (sk );
1132
1133
1133
1134
/* Fail if user set invalid QoS */
1134
1135
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)
1159
1160
}
1160
1161
1161
1162
unlock :
1163
+ release_sock (sk );
1162
1164
hci_dev_unlock (hdev );
1163
1165
hci_dev_put (hdev );
1164
1166
return err ;
@@ -1187,6 +1189,7 @@ static int iso_sock_listen(struct socket *sock, int backlog)
1187
1189
1188
1190
BT_DBG ("sk %p backlog %d" , sk , backlog );
1189
1191
1192
+ sock_hold (sk );
1190
1193
lock_sock (sk );
1191
1194
1192
1195
if (sk -> sk_state != BT_BOUND ) {
@@ -1199,10 +1202,16 @@ static int iso_sock_listen(struct socket *sock, int backlog)
1199
1202
goto done ;
1200
1203
}
1201
1204
1202
- if (!bacmp (& iso_pi (sk )-> dst , BDADDR_ANY ))
1205
+ if (!bacmp (& iso_pi (sk )-> dst , BDADDR_ANY )) {
1203
1206
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 );
1205
1212
err = iso_listen_bis (sk );
1213
+ lock_sock (sk );
1214
+ }
1206
1215
1207
1216
if (err )
1208
1217
goto done ;
@@ -1214,6 +1223,7 @@ static int iso_sock_listen(struct socket *sock, int backlog)
1214
1223
1215
1224
done :
1216
1225
release_sock (sk );
1226
+ sock_put (sk );
1217
1227
return err ;
1218
1228
}
1219
1229
You can’t perform that action at this time.
0 commit comments