summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2012-02-23 09:52:28 +0200
committerJohan Hedberg <johan.hedberg@intel.com>2012-02-23 13:07:02 +0200
commit60fc5fb66efa0bcbe028637206ed59df8cd4ac19 (patch)
treea44a49c3003eb7377e1428c276e26895cb029c41 /net
parentb3fb611ec7b76048cb14600e9a5a9b57e5d913da (diff)
downloadlinux-stable-60fc5fb66efa0bcbe028637206ed59df8cd4ac19.tar.gz
linux-stable-60fc5fb66efa0bcbe028637206ed59df8cd4ac19.tar.bz2
linux-stable-60fc5fb66efa0bcbe028637206ed59df8cd4ac19.zip
Bluetooth: mgmt: Fix count parameter in get_connections reply
This patch fixes the count parameter in the Get Connections reply message. We cannot know the right number until iterating through all connections so set the parameter value only after the loop. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net')
-rw-r--r--net/bluetooth/mgmt.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 42d665bdc01f..7fdba8fb9808 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1725,8 +1725,8 @@ static int get_connections(struct sock *sk, u16 index)
struct hci_dev *hdev;
struct hci_conn *c;
size_t rp_len;
- u16 count;
- int i, err;
+ int err;
+ u16 i;
BT_DBG("");
@@ -1743,21 +1743,19 @@ static int get_connections(struct sock *sk, u16 index)
goto unlock;
}
- count = 0;
+ i = 0;
list_for_each_entry(c, &hdev->conn_hash.list, list) {
if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
- count++;
+ i++;
}
- rp_len = sizeof(*rp) + (count * sizeof(struct mgmt_addr_info));
+ rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
rp = kmalloc(rp_len, GFP_ATOMIC);
if (!rp) {
err = -ENOMEM;
goto unlock;
}
- put_unaligned_le16(count, &rp->conn_count);
-
i = 0;
list_for_each_entry(c, &hdev->conn_hash.list, list) {
if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
@@ -1769,6 +1767,8 @@ static int get_connections(struct sock *sk, u16 index)
i++;
}
+ put_unaligned_le16(i, &rp->conn_count);
+
/* Recalculate length in case of filtered SCO connections, etc */
rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));