diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-02-17 15:49:33 -0500 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-02-27 00:14:48 -0500 |
commit | 37e62f5516cfb210e64fe53457932df4341b0ad1 (patch) | |
tree | 7bf4d14be4acbc9f9198d5dedb5ed5fb9badb729 | |
parent | 2a517ca687232adc8f14893730644da712010ffc (diff) |
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>
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 5576c8191507..1d0fb0f23c63 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -658,6 +658,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst | |||
658 | bacpy(&addr.l2_bdaddr, src); | 658 | bacpy(&addr.l2_bdaddr, src); |
659 | addr.l2_family = AF_BLUETOOTH; | 659 | addr.l2_family = AF_BLUETOOTH; |
660 | addr.l2_psm = 0; | 660 | addr.l2_psm = 0; |
661 | addr.l2_cid = 0; | ||
661 | *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); | 662 | *err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); |
662 | if (*err < 0) | 663 | if (*err < 0) |
663 | goto failed; | 664 | goto failed; |
@@ -679,6 +680,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst | |||
679 | bacpy(&addr.l2_bdaddr, dst); | 680 | bacpy(&addr.l2_bdaddr, dst); |
680 | addr.l2_family = AF_BLUETOOTH; | 681 | addr.l2_family = AF_BLUETOOTH; |
681 | addr.l2_psm = htobs(RFCOMM_PSM); | 682 | addr.l2_psm = htobs(RFCOMM_PSM); |
683 | addr.l2_cid = 0; | ||
682 | *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK); | 684 | *err = kernel_connect(sock, (struct sockaddr *) &addr, sizeof(addr), O_NONBLOCK); |
683 | if (*err == 0 || *err == -EINPROGRESS) | 685 | if (*err == 0 || *err == -EINPROGRESS) |
684 | return s; | 686 | return s; |
@@ -1919,6 +1921,7 @@ static int rfcomm_add_listener(bdaddr_t *ba) | |||
1919 | bacpy(&addr.l2_bdaddr, ba); | 1921 | bacpy(&addr.l2_bdaddr, ba); |
1920 | addr.l2_family = AF_BLUETOOTH; | 1922 | addr.l2_family = AF_BLUETOOTH; |
1921 | addr.l2_psm = htobs(RFCOMM_PSM); | 1923 | addr.l2_psm = htobs(RFCOMM_PSM); |
1924 | addr.l2_cid = 0; | ||
1922 | err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); | 1925 | err = kernel_bind(sock, (struct sockaddr *) &addr, sizeof(addr)); |
1923 | if (err < 0) { | 1926 | if (err < 0) { |
1924 | BT_ERR("Bind failed %d", err); | 1927 | BT_ERR("Bind failed %d", err); |