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