Skip to contentSkip to conversation

IB/srp: Use struct_size() in kzalloc()

PATCH Applied Gustavo A. R. Silva 3 participants 3 messages Jan 8, 2019

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

PATCH 1/1 IB/srp: 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/infiniband/ulp/srp/ib_srp.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/infiniband/ulp/srp/ib_srp.c +1 -2
index 31d91538bbf4..0f855294ff3f 100644
@@ -443,8 +443,7 @@ static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,
 	if (pool_size <= 0)
 		goto err;
 	ret = -ENOMEM;
-	pool = kzalloc(sizeof(struct srp_fr_pool) +
-		       pool_size * sizeof(struct srp_fr_desc), GFP_KERNEL);
+	pool = kzalloc(struct_size(pool, desc, pool_size), GFP_KERNEL);
 	if (!pool)
 		goto err;
 	pool->size = pool_size;
Signature · 1 line
2.20.1
maintainer Reviewed-by on v1 1/1
#1 lore raw
Quoted 24 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:

instance =kzalloc(struct_size(instance, entry, count), GFP_KERNEL);> This code was detected with the help of Coccinelle.

drivers/infiniband/ulp/srp/ib_srp.c |3 +---

1 file changed, 1 insertion(+-), 2 deletions(-)
drivers/infiniband/ulp/srp/ib_srp.c +1 -1
index 31d91538bbf4..0f855294ff3f 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+-+-+- b/drivers/infiniband/ulp/srp/ib_srp.c

@@-443,8 +-443,7 @@static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device,

	if (pool_size <=0)
		goto err;> 	ret =-ENOMEM;>-	pool =kzalloc(sizeof(struct srp_fr_pool) +-
drivers/infiniband/ulp/srp/ib_srp.c +0 -1
-		       pool_size *sizeof(struct srp_fr_desc), GFP_KERNEL);>+-	pool =kzalloc(struct_size(pool, desc, pool_size), GFP_KERNEL);> 	if (!pool)
Quoted 1 line
		goto err;> 	pool->size =pool_size;
#2 lore raw
In reply to Gustavo A. R. Silva
Quoted 16 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:

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

Quoted 7 lines

This code was detected with the help of Coccinelle.

---
 drivers/infiniband/ulp/srp/ib_srp.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Applied to for-next

Thanks,
Jason