mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 08:46:46 +00:00
Bluetooth: Fix RFCOMM usage of in-kernel L2CAP sockets
The CID value of L2CAP sockets need to be set to zero. All userspace applications do this via memset() on the sockaddr_l2 structure. The RFCOMM implementation uses in-kernel L2CAP sockets and so it has to make sure that l2_cid is set to zero. Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
2a517ca687
commit
37e62f5516
1 changed files with 3 additions and 0 deletions
|
@ -658,6 +658,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
|
||||||
bacpy(&addr.l2_bdaddr, src);
|
bacpy(&addr.l2_bdaddr, src);
|
||||||
addr.l2_family = AF_BLUETOOTH;
|
addr.l2_family = AF_BLUETOOTH;
|
||||||
addr.l2_psm = 0;
|
addr.l2_psm = 0;
|
||||||
|
addr.l2_cid = 0;
|
||||||
*err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
|
*err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
|
||||||
if (*err < 0)
|
if (*err < 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
@ -679,6 +680,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
|
||||||
bacpy(&addr.l2_bdaddr, dst);
|
bacpy(&addr.l2_bdaddr, dst);
|
||||||
addr.l2_family = AF_BLUETOOTH;
|
addr.l2_family = AF_BLUETOOTH;
|
||||||
addr.l2_psm = htobs(RFCOMM_PSM);
|
addr.l2_psm = htobs(RFCOMM_PSM);
|
||||||
|
addr.l2_cid = 0;
|
||||||
*err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
|
*err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK);
|
||||||
if (*err == 0 || *err == -EINPROGRESS)
|
if (*err == 0 || *err == -EINPROGRESS)
|
||||||
return s;
|
return s;
|
||||||
|
@ -1919,6 +1921,7 @@ static int rfcomm_add_listener(bdaddr_t *ba)
|
||||||
bacpy(&addr.l2_bdaddr, ba);
|
bacpy(&addr.l2_bdaddr, ba);
|
||||||
addr.l2_family = AF_BLUETOOTH;
|
addr.l2_family = AF_BLUETOOTH;
|
||||||
addr.l2_psm = htobs(RFCOMM_PSM);
|
addr.l2_psm = htobs(RFCOMM_PSM);
|
||||||
|
addr.l2_cid = 0;
|
||||||
err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
|
err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr));
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
BT_ERR("Bind failed %d", err);
|
BT_ERR("Bind failed %d", err);
|
||||||
|
|
Loading…
Reference in a new issue