Skip to contentSkip to conversation

md/raid10: Use struct_size() in kmalloc()

PATCH In review Gustavo A. R. Silva 2 participants 2 messages Jan 4, 2019 – Jan 7, 2019 MD RAID

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 md/raid10: Use struct_size() in kmalloc()

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 = kmalloc(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 = kmalloc(struct_size(instance, entry, count), GFP_KERNEL);

This code was detected with the help of Coccinelle.

---
 drivers/md/raid10.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/md/raid10.c +1 -2
index abb5d382f64d..320cb430cca6 100644
@@ -4788,8 +4788,7 @@ static int handle_reshape_read_error(struct mddev *mddev,
 	int idx = 0;
 	struct page **pages;
 
-	r10b = kmalloc(sizeof(*r10b) +
-	       sizeof(struct r10dev) * conf->copies, GFP_NOIO);
+	r10b = kmalloc(struct_size(r10b, devs, conf->copies), GFP_NOIO);
 	if (!r10b) {
 		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
 		return -ENOMEM;
Signature · 1 line
2.20.1
Acked-by on v1 1/1
#1 lore raw
Quoted 12 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 = kmalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);

Quoted 8 lines

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

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

This code was detected with the help of Coccinelle.

Quoted 21 lines
---
 drivers/md/raid10.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/md/raid10.c +1 -3
index abb5d382f64d..320cb430cca6 100644
@@ -4788,8 +4788,7 @@ static int handle_reshape_read_error(struct mddev *mddev,
        int idx = 0;
        struct page **pages;
 
-       r10b = kmalloc(sizeof(*r10b) +
-              sizeof(struct r10dev) * conf->copies, GFP_NOIO);
+       r10b = kmalloc(struct_size(r10b, devs, conf->copies), GFP_NOIO);
        if (!r10b) {
                set_bit(MD_RECOVERY_INTR, &mddev->recovery);
                return -ENOMEM;
--

2.20.1