@@ -261,13 +261,13 @@ static int iso_connect_bis(struct sock *sk)
261
261
262
262
if (!bis_capable (hdev )) {
263
263
err = - EOPNOTSUPP ;
264
- goto done ;
264
+ goto unlock ;
265
265
}
266
266
267
267
/* Fail if out PHYs are marked as disabled */
268
268
if (!iso_pi (sk )-> qos .out .phy ) {
269
269
err = - EINVAL ;
270
- goto done ;
270
+ goto unlock ;
271
271
}
272
272
273
273
hcon = hci_connect_bis (hdev , & iso_pi (sk )-> dst ,
@@ -276,22 +276,27 @@ static int iso_connect_bis(struct sock *sk)
276
276
iso_pi (sk )-> base );
277
277
if (IS_ERR (hcon )) {
278
278
err = PTR_ERR (hcon );
279
- goto done ;
279
+ goto unlock ;
280
280
}
281
281
282
282
conn = iso_conn_add (hcon );
283
283
if (!conn ) {
284
284
hci_conn_drop (hcon );
285
285
err = - ENOMEM ;
286
- goto done ;
286
+ goto unlock ;
287
287
}
288
288
289
+ hci_dev_unlock (hdev );
290
+ hci_dev_put (hdev );
291
+
292
+ lock_sock (sk );
293
+
289
294
/* Update source addr of the socket */
290
295
bacpy (& iso_pi (sk )-> src , & hcon -> src );
291
296
292
297
err = iso_chan_add (conn , sk , NULL );
293
298
if (err )
294
- goto done ;
299
+ goto release ;
295
300
296
301
if (hcon -> state == BT_CONNECTED ) {
297
302
iso_sock_clear_timer (sk );
@@ -301,7 +306,11 @@ static int iso_connect_bis(struct sock *sk)
301
306
iso_sock_set_timer (sk , sk -> sk_sndtimeo );
302
307
}
303
308
304
- done :
309
+ release :
310
+ release_sock (sk );
311
+ return err ;
312
+
313
+ unlock :
305
314
hci_dev_unlock (hdev );
306
315
hci_dev_put (hdev );
307
316
return err ;
@@ -325,13 +334,13 @@ static int iso_connect_cis(struct sock *sk)
325
334
326
335
if (!cis_central_capable (hdev )) {
327
336
err = - EOPNOTSUPP ;
328
- goto done ;
337
+ goto unlock ;
329
338
}
330
339
331
340
/* Fail if either PHYs are marked as disabled */
332
341
if (!iso_pi (sk )-> qos .in .phy && !iso_pi (sk )-> qos .out .phy ) {
333
342
err = - EINVAL ;
334
- goto done ;
343
+ goto unlock ;
335
344
}
336
345
337
346
/* Just bind if DEFER_SETUP has been set */
@@ -341,31 +350,36 @@ static int iso_connect_cis(struct sock *sk)
341
350
& iso_pi (sk )-> qos );
342
351
if (IS_ERR (hcon )) {
343
352
err = PTR_ERR (hcon );
344
- goto done ;
353
+ goto unlock ;
345
354
}
346
355
} else {
347
356
hcon = hci_connect_cis (hdev , & iso_pi (sk )-> dst ,
348
357
le_addr_type (iso_pi (sk )-> dst_type ),
349
358
& iso_pi (sk )-> qos );
350
359
if (IS_ERR (hcon )) {
351
360
err = PTR_ERR (hcon );
352
- goto done ;
361
+ goto unlock ;
353
362
}
354
363
}
355
364
356
365
conn = iso_conn_add (hcon );
357
366
if (!conn ) {
358
367
hci_conn_drop (hcon );
359
368
err = - ENOMEM ;
360
- goto done ;
369
+ goto unlock ;
361
370
}
362
371
372
+ hci_dev_unlock (hdev );
373
+ hci_dev_put (hdev );
374
+
375
+ lock_sock (sk );
376
+
363
377
/* Update source addr of the socket */
364
378
bacpy (& iso_pi (sk )-> src , & hcon -> src );
365
379
366
380
err = iso_chan_add (conn , sk , NULL );
367
381
if (err )
368
- goto done ;
382
+ goto release ;
369
383
370
384
if (hcon -> state == BT_CONNECTED ) {
371
385
iso_sock_clear_timer (sk );
@@ -378,7 +392,11 @@ static int iso_connect_cis(struct sock *sk)
378
392
iso_sock_set_timer (sk , sk -> sk_sndtimeo );
379
393
}
380
394
381
- done :
395
+ release :
396
+ release_sock (sk );
397
+ return err ;
398
+
399
+ unlock :
382
400
hci_dev_unlock (hdev );
383
401
hci_dev_put (hdev );
384
402
return err ;
@@ -832,20 +850,23 @@ static int iso_sock_connect(struct socket *sock, struct sockaddr *addr,
832
850
bacpy (& iso_pi (sk )-> dst , & sa -> iso_bdaddr );
833
851
iso_pi (sk )-> dst_type = sa -> iso_bdaddr_type ;
834
852
853
+ release_sock (sk );
854
+
835
855
if (bacmp (& iso_pi (sk )-> dst , BDADDR_ANY ))
836
856
err = iso_connect_cis (sk );
837
857
else
838
858
err = iso_connect_bis (sk );
839
859
840
860
if (err )
841
- goto done ;
861
+ return err ;
862
+
863
+ lock_sock (sk );
842
864
843
865
if (!test_bit (BT_SK_DEFER_SETUP , & bt_sk (sk )-> flags )) {
844
866
err = bt_sock_wait_state (sk , BT_CONNECTED ,
845
867
sock_sndtimeo (sk , flags & O_NONBLOCK ));
846
868
}
847
869
848
- done :
849
870
release_sock (sk );
850
871
return err ;
851
872
}
@@ -1101,28 +1122,22 @@ static int iso_sock_recvmsg(struct socket *sock, struct msghdr *msg,
1101
1122
{
1102
1123
struct sock * sk = sock -> sk ;
1103
1124
struct iso_pinfo * pi = iso_pi (sk );
1104
- int err ;
1105
1125
1106
1126
BT_DBG ("sk %p" , sk );
1107
1127
1108
- lock_sock (sk );
1109
-
1110
1128
if (test_and_clear_bit (BT_SK_DEFER_SETUP , & bt_sk (sk )-> flags )) {
1111
1129
switch (sk -> sk_state ) {
1112
1130
case BT_CONNECT2 :
1131
+ lock_sock (sk );
1113
1132
iso_conn_defer_accept (pi -> conn -> hcon );
1114
1133
sk -> sk_state = BT_CONFIG ;
1115
1134
release_sock (sk );
1116
1135
return 0 ;
1117
1136
case BT_CONNECT :
1118
- err = iso_connect_cis (sk );
1119
- release_sock (sk );
1120
- return err ;
1137
+ return iso_connect_cis (sk );
1121
1138
}
1122
1139
}
1123
1140
1124
- release_sock (sk );
1125
-
1126
1141
return bt_sock_recvmsg (sock , msg , len , flags );
1127
1142
}
1128
1143
0 commit comments