Bluetooth: mgmt: Use struct_size() helper
Subsystems (4)
PATCH 1/1 Bluetooth: mgmt: Use struct_size() helper
One of the more common cases of allocation size calculations is finding the size of a structure that has a zero-sized array at the end, along with memory for some number of elements for that array. For example:
struct mgmt_rp_get_connections {
...
struct mgmt_addr_info addr[0];
} __packed;Make use of the struct_size() helper instead of an open-coded version in order to avoid any potential type mistakes.
So, replace the following form:
sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
with:
struct_size(rp, addr, i)
Also, notice that, in this case, variable rp_len is not necessary, hence it is removed.
This code was detected with the help of Coccinelle.
--- net/bluetooth/mgmt.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
net/bluetooth/mgmt.c +2 -6
@@ -2588,7 +2588,6 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, {struct mgmt_rp_get_connections *rp;struct hci_conn *c; -size_t rp_len;int err;u16 i;
@@ -2608,8 +2607,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, i++; } - rp_len =sizeof (*rp) + (i *sizeof (struct mgmt_addr_info )); - rp =kmalloc (rp_len,GFP_KERNEL ); + rp =kmalloc (struct_size (rp, addr, i),GFP_KERNEL );if (!rp) { err = -ENOMEM ; goto unlock;
@@ -2629,10 +2627,8 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, rp->conn_count =cpu_to_le16 (i);/* Recalculate length in case of filtered SCO connections, etc */ - rp_len =sizeof (*rp) + (i *sizeof (struct mgmt_addr_info )); - err =mgmt_cmd_complete (sk, hdev->id,MGMT_OP_GET_CONNECTIONS ,0 , rp, - rp_len); +struct_size (rp, addr, i));kfree (rp);
Signature · 1 line
2.23.0
Marcel Holtmann
maintainerHi Gustavo,
Quoted 23 lines
One of the more common cases of allocation size calculations is finding the size of a structure that has a zero-sized array at the end, along with memory for some number of elements for that array. For example:
struct mgmt_rp_get_connections { ... struct mgmt_addr_info addr[0]; } __packed;Make use of the
struct_size()helper instead of an open-coded version in order to avoid any potential type mistakes.So, replace the following form:
sizeof(*rp)+ (i *sizeof(struct mgmt_addr_info));with:
struct_size(rp, addr, i)Also, notice that, in this case, variable
rp_lenis not necessary, hence it is removed.
Quoted 6 lines
This code was detected with the help of Coccinelle.
Signed-off-by Gustavo A. R. Silva <[email protected]>---
net/bluetooth/mgmt.c| 8 ++------1 file changed, 2 insertions(+), 6 deletions(-)
patch has been applied to bluetooth-next tree.
Regards
Marcel