Skip to content

Commit 0a766a0

Browse files
committed
Bluetooth: ISO: Fix getpeername not returning sockaddr_iso_bc fields
If the socket is a broadcast receiver fields from sockaddr_iso_bc shall be part of the values returned to getpeername since some of these fields are updated while doing the PA and BIG sync procedures. Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent e2d471b commit 0a766a0

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

net/bluetooth/iso.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,6 +1330,7 @@ static int iso_sock_getname(struct socket *sock, struct sockaddr *addr,
13301330
{
13311331
struct sockaddr_iso *sa = (struct sockaddr_iso *)addr;
13321332
struct sock *sk = sock->sk;
1333+
int len = sizeof(struct sockaddr_iso);
13331334

13341335
BT_DBG("sock %p, sk %p", sock, sk);
13351336

@@ -1338,12 +1339,20 @@ static int iso_sock_getname(struct socket *sock, struct sockaddr *addr,
13381339
if (peer) {
13391340
bacpy(&sa->iso_bdaddr, &iso_pi(sk)->dst);
13401341
sa->iso_bdaddr_type = iso_pi(sk)->dst_type;
1342+
1343+
if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
1344+
sa->iso_bc->bc_sid = iso_pi(sk)->bc_sid;
1345+
sa->iso_bc->bc_num_bis = iso_pi(sk)->bc_num_bis;
1346+
memcpy(sa->iso_bc->bc_bis, iso_pi(sk)->bc_bis,
1347+
ISO_MAX_NUM_BIS);
1348+
len += sizeof(struct sockaddr_iso_bc);
1349+
}
13411350
} else {
13421351
bacpy(&sa->iso_bdaddr, &iso_pi(sk)->src);
13431352
sa->iso_bdaddr_type = iso_pi(sk)->src_type;
13441353
}
13451354

1346-
return sizeof(struct sockaddr_iso);
1355+
return len;
13471356
}
13481357

13491358
static int iso_sock_sendmsg(struct socket *sock, struct msghdr *msg,
@@ -1988,11 +1997,13 @@ static void iso_conn_ready(struct iso_conn *conn)
19881997
hcon->dst_type = iso_pi(parent)->dst_type;
19891998
}
19901999

1991-
if (ev3) {
2000+
if (test_bit(HCI_CONN_PA_SYNC, &hcon->flags)) {
19922001
iso_pi(sk)->qos = iso_pi(parent)->qos;
19932002
hcon->iso_qos = iso_pi(sk)->qos;
2003+
iso_pi(sk)->bc_sid = iso_pi(parent)->bc_sid;
19942004
iso_pi(sk)->bc_num_bis = iso_pi(parent)->bc_num_bis;
1995-
memcpy(iso_pi(sk)->bc_bis, iso_pi(parent)->bc_bis, ISO_MAX_NUM_BIS);
2005+
memcpy(iso_pi(sk)->bc_bis, iso_pi(parent)->bc_bis,
2006+
ISO_MAX_NUM_BIS);
19962007
set_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags);
19972008
}
19982009

0 commit comments

Comments
 (0)