diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-02-15 20:57:30 -0500 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-02-27 00:14:46 -0500 |
commit | d5f2d2be68876f65dd051b978a7b66265fde9ffd (patch) | |
tree | bb2a9023185a8d4812dfc99634c041fddcfc64e5 /net/bluetooth/af_bluetooth.c | |
parent | 96a3183322cba1a2846771b067c99b9d6f481263 (diff) |
Bluetooth: Fix poll() misbehavior when using BT_DEFER_SETUP
When BT_DEFER_SETUP has been enabled on a Bluetooth socket it keeps
signaling POLLIN all the time. This is a wrong behavior. The POLLIN
should only be signaled if the client socket is in BT_CONNECT2 state
and the parent has been BT_DEFER_SETUP enabled.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/af_bluetooth.c')
-rw-r--r-- | net/bluetooth/af_bluetooth.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index ded57974390e..02b9baa1930b 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -270,12 +270,11 @@ static inline unsigned int bt_accept_poll(struct sock *parent) | |||
270 | struct list_head *p, *n; | 270 | struct list_head *p, *n; |
271 | struct sock *sk; | 271 | struct sock *sk; |
272 | 272 | ||
273 | if (bt_sk(parent)->defer_setup) | ||
274 | return POLLIN | POLLRDNORM; | ||
275 | |||
276 | list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { | 273 | list_for_each_safe(p, n, &bt_sk(parent)->accept_q) { |
277 | sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); | 274 | sk = (struct sock *) list_entry(p, struct bt_sock, accept_q); |
278 | if (sk->sk_state == BT_CONNECTED) | 275 | if (sk->sk_state == BT_CONNECTED || |
276 | (bt_sk(parent)->defer_setup && | ||
277 | sk->sk_state == BT_CONNECT2)) | ||
279 | return POLLIN | POLLRDNORM; | 278 | return POLLIN | POLLRDNORM; |
280 | } | 279 | } |
281 | 280 | ||