Skip to contentSkip to conversation

qtnfmac: use struct_size() in kzalloc()

PATCH In review Gustavo A. R. Silva 3 participants 3 messages Jan 8, 2019 – Feb 1, 2019

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 qtnfmac: use struct_size() in kzalloc()

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 foo {
    int stuff;
    void *entry[];
};

instance = kzalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);

Instead of leaving these open-coded and prone to type mistakes, we can now use the new struct_size() helper:

instance = kzalloc(struct_size(instance, entry, count), GFP_KERNEL);

This code was detected with the help of Coccinelle.

---
 drivers/net/wireless/quantenna/qtnfmac/commands.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/wireless/quantenna/qtnfmac/commands.c +2 -3
index 659e7649fe22..cf386f579060 100644
@@ -914,9 +914,8 @@ qtnf_cmd_resp_proc_hw_info(struct qtnf_bus *bus,
 	if (WARN_ON(resp->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
 		return -E2BIG;
 
-	hwinfo->rd = kzalloc(sizeof(*hwinfo->rd)
-			     + sizeof(struct ieee80211_reg_rule)
-			     * resp->n_reg_rules, GFP_KERNEL);
+	hwinfo->rd = kzalloc(struct_size(hwinfo->rd, reg_rules,
+					 resp->n_reg_rules), GFP_KERNEL);
 
 	if (!hwinfo->rd)
 		return -ENOMEM;
Signature · 1 line
2.20.1
Reviewed-by on v1 1/1
#1 lore raw
Quoted 8 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 foo {
    int stuff;
    void *entry[];
};

...

Quoted 11 lines
---
 drivers/net/wireless/quantenna/qtnfmac/commands.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/wireless/quantenna/qtnfmac/commands.c +0 -0
index 659e7649fe22..cf386f579060 100644
@@ -914,9 +914,8 @@ qtnf_cmd_resp_proc_hw_info(struct qtnf_bus *bus,
        if (WARN_ON(resp->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))

drivers/net/wireless/quantenna/qtnfmac/commands.c qtnf_cmd_resp_proc_hw_info(struct qtnf_bus *bus, · line 921

Quoted 10 lines
drivers/net/wireless/quantenna/qtnfmac/commands.c +2 -3
                return -E2BIG;
 
-       hwinfo->rd = kzalloc(sizeof(*hwinfo->rd)
-                            + sizeof(struct ieee80211_reg_rule)
-                            * resp->n_reg_rules, GFP_KERNEL);
+       hwinfo->rd = kzalloc(struct_size(hwinfo->rd, reg_rules,
+                                        resp->n_reg_rules), GFP_KERNEL);
 
        if (!hwinfo->rd)
                return -ENOMEM;

Thanks!

Regards,
Sergey

#2 lore raw
In reply to Gustavo A. R. Silva
Quoted 14 lines · Gustavo A. R. Silva

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 foo {
    int stuff;
    void *entry[];
};

instance = kzalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);

Instead of leaving these open-coded and prone to type mistakes, we can now use the new struct_size() helper:

Quoted 6 lines

instance = kzalloc(struct_size(instance, entry, count), GFP_KERNEL);

This code was detected with the help of Coccinelle.

Patch applied to wireless-drivers-next.git, thanks.

db040dfa53e2 qtnfmac: use struct_size() in kzalloc()

Signature · 3 lines
https://patchwork.kernel.org/patch/10752601/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches