Re: [PATCH v2] Bluetooth: Fix channel check when binding RFCOMM sock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andrzej,

> When binding RFCOMM socket with non-zero channel we're checking if
> there is already any other socket which has the same channel number
> assigned and then fail. This check does not consider situation where
> we have another socket connected to remote device on given channel
> number in which case we still should be able to bind local socket.
> 
> This patch changes __rfcomm_get_sock_by_addr() to return only sockets
> in either BT_BOUND or BT_LISTEN states, also name is updated to better
> describe what this function does now.
> 
> Signed-off-by: Andrzej Kaczmarek <andrzej.kaczmarek@xxxxxxxxx>
> ---
> net/bluetooth/rfcomm/sock.c | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
> index 00573fb..1a59ddd 100644
> --- a/net/bluetooth/rfcomm/sock.c
> +++ b/net/bluetooth/rfcomm/sock.c
> @@ -105,13 +105,18 @@ static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
> }
> 
> /* ---- Socket functions ---- */
> -static struct sock *__rfcomm_get_sock_by_addr(u8 channel, bdaddr_t *src)
> +static struct sock *__rfcomm_get_listen_sock_by_addr(u8 channel, bdaddr_t *src)
> {
> 	struct sock *sk = NULL;
> 
> 	sk_for_each(sk, &rfcomm_sk_list.head) {
> -		if (rfcomm_pi(sk)->channel == channel &&
> -				!bacmp(&rfcomm_pi(sk)->src, src))
> +		if (rfcomm_pi(sk)->channel != channel)
> +			continue;
> +
> +		if (bacmp(&rfcomm_pi(sk)->src, src))
> +			continue;
> +
> +		if (sk->sk_state == BT_BOUND || sk->sk_state == BT_LISTEN)
> 			break;
> 	}
> 
> @@ -352,7 +357,8 @@ static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr
> 
> 	write_lock(&rfcomm_sk_list.lock);
> 
> -	if (sa->rc_channel && __rfcomm_get_sock_by_addr(sa->rc_channel, &sa->rc_bdaddr)) {
> +	if (sa->rc_channel && __rfcomm_get_listen_sock_by_addr(sa->rc_channel,
> +							&sa->rc_bdaddr)) {

you need to fix the indentation here. If that is a problem, then maybe we need a shorter function name.

> 		err = -EADDRINUSE;
> 	} else {
> 		/* Save source address */
> @@ -439,7 +445,7 @@ static int rfcomm_sock_listen(struct socket *sock, int backlog)
> 		write_lock(&rfcomm_sk_list.lock);
> 
> 		for (channel = 1; channel < 31; channel++)
> -			if (!__rfcomm_get_sock_by_addr(channel, src)) {
> +			if (!__rfcomm_get_listen_sock_by_addr(channel, src)) {
> 				rfcomm_pi(sk)->channel = channel;
> 				err = 0;
> 				break;

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux