Skip to content

Commit

Permalink
[Bluetooth] Signal user-space for HIDP and BNEP socket errors
Browse files Browse the repository at this point in the history
When using the HIDP or BNEP kernel support, the user-space needs to
know if the connection has been terminated for some reasons. Wake up
the application if that happens. Otherwise kernel and user-space are
no longer on the same page and weird behaviors can happen.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
holtmann committed Jul 14, 2008
1 parent a0c22f2 commit ec8dab3
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
5 changes: 5 additions & 0 deletions net/bluetooth/bnep/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,11 @@ static int bnep_session(void *arg)
/* Delete network device */
unregister_netdev(dev);

/* Wakeup user-space polling for socket errors */
s->sock->sk->sk_err = EUNATCH;

wake_up_interruptible(s->sock->sk->sk_sleep);

/* Release the socket */
fput(s->sock->file);

Expand Down
10 changes: 10 additions & 0 deletions net/bluetooth/hidp/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,12 @@ static int hidp_session(void *arg)
hid_free_device(session->hid);
}

/* Wakeup user-space polling for socket errors */
session->intr_sock->sk->sk_err = EUNATCH;
session->ctrl_sock->sk->sk_err = EUNATCH;

hidp_schedule(session);

fput(session->intr_sock->file);

wait_event_timeout(*(ctrl_sk->sk_sleep),
Expand Down Expand Up @@ -879,6 +885,10 @@ int hidp_del_connection(struct hidp_conndel_req *req)
skb_queue_purge(&session->ctrl_transmit);
skb_queue_purge(&session->intr_transmit);

/* Wakeup user-space polling for socket errors */
session->intr_sock->sk->sk_err = EUNATCH;
session->ctrl_sock->sk->sk_err = EUNATCH;

/* Kill session thread */
atomic_inc(&session->terminate);
hidp_schedule(session);
Expand Down

0 comments on commit ec8dab3

Please sign in to comment.