Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9a3c20a authored by Peter Hurley's avatar Peter Hurley Committed by Gustavo Padovan
Browse files

Bluetooth: l2cap: Fix lost wakeups waiting to accept socket



Fix race conditions which can cause lost wakeups (or misssed signals)
while waiting to accept an l2cap socket connection.

Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 9be4e3fb
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -235,30 +235,26 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl

	lock_sock_nested(sk, SINGLE_DEPTH_NESTING);

	if (sk->sk_state != BT_LISTEN) {
		err = -EBADFD;
		goto done;
	}

	timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);

	BT_DBG("sk %p timeo %ld", sk, timeo);

	/* Wait for an incoming connection. (wake-one). */
	add_wait_queue_exclusive(sk_sleep(sk), &wait);
	while (!(nsk = bt_accept_dequeue(sk, newsock))) {
	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);
		if (!timeo) {
			err = -EAGAIN;

		if (sk->sk_state != BT_LISTEN) {
			err = -EBADFD;
			break;
		}

		release_sock(sk);
		timeo = schedule_timeout(timeo);
		lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
		nsk = bt_accept_dequeue(sk, newsock);
		if (nsk)
			break;

		if (sk->sk_state != BT_LISTEN) {
			err = -EBADFD;
		if (!timeo) {
			err = -EAGAIN;
			break;
		}

@@ -266,8 +262,12 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl
			err = sock_intr_errno(timeo);
			break;
		}

		release_sock(sk);
		timeo = schedule_timeout(timeo);
		lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
	}
	set_current_state(TASK_RUNNING);
	__set_current_state(TASK_RUNNING);
	remove_wait_queue(sk_sleep(sk), &wait);

	if (err)