Skip to contentSkip to conversation

libceph, ceph: use struct_size() in kmalloc()

PATCH Applied Gustavo A. R. Silva 2 participants 3 messages Jan 15, 2019 – Jan 25, 2019

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

PATCH 1/1 libceph, ceph: 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;
    struct boo entry[];
};

instance = kmalloc(sizeof(struct foo) + count * sizeof(struct boo), 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.

---
 net/ceph/osdmap.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
net/ceph/osdmap.c +2 -3
index 98c0ff3d6441..48a31dc9161c 100644
@@ -495,9 +495,8 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
 			  / sizeof(struct crush_rule_step))
 			goto bad;
 #endif
-		r = c->rules[i] = kmalloc(sizeof(*r) +
-					  yes*sizeof(struct crush_rule_step),
-					  GFP_NOFS);
+		r = kmalloc(struct_size(r, steps, yes), GFP_NOFS);
+		c->rules[i] = r;
 		if (r == NULL)
 			goto badmem;
 		dout(" rule %d is at %p\n", i, r);
Signature · 1 line
2.20.1
maintainer Applied
#1 lore raw
Quoted 30 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;
    struct boo entry[];
};

instance = kmalloc(sizeof(struct foo) + count * sizeof(struct boo), 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.

---
 net/ceph/osdmap.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
net/ceph/osdmap.c +0 -0
index 98c0ff3d6441..48a31dc9161c 100644
@@ -495,9 +495,8 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
                          / sizeof(struct crush_rule_step))

net/ceph/osdmap.c static struct crush_map *crush_decode(void *pbyval, void *end) · line 502

Quoted 10 lines
net/ceph/osdmap.c +2 -3
                        goto bad;
 #endif
-               r = c->rules[i] = kmalloc(sizeof(*r) +
-                                         yes*sizeof(struct crush_rule_step),
-                                         GFP_NOFS);
+               r = kmalloc(struct_size(r, steps, yes), GFP_NOFS);
+               c->rules[i] = r;
                if (r == NULL)
                        goto badmem;
                dout(" rule %d is at %p\n", i, r);

Applied.

Thanks,

Ilya

#2 lore raw
Quoted 36 lines · Ilya Dryomov
Quoted 34 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;
    struct boo entry[];
};

instance = kmalloc(sizeof(struct foo) + count * sizeof(struct boo), 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.

---
 net/ceph/osdmap.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
net/ceph/osdmap.c +0 -2
index 98c0ff3d6441..48a31dc9161c 100644
@@ -495,9 +495,8 @@ static struct crush_map *crush_decode(void *pbyval, void *end)
                          / sizeof(struct crush_rule_step))
                        goto bad;
 #endif
-               r = c->rules[i] = kmalloc(sizeof(*r) +
-                                         yes*sizeof(struct crush_rule_step),
Quoted 9 lines

net/ceph/osdmap.c static struct crush_map *crush_decode(void *pbyval, void *end) · line 502

Quoted 6 lines
net/ceph/osdmap.c +2 -1
-                                         GFP_NOFS);
+               r = kmalloc(struct_size(r, steps, yes), GFP_NOFS);
+               c->rules[i] = r;
                if (r == NULL)
                        goto badmem;
                dout(" rule %d is at %p\n", i, r);

Applied.

Thanks, Ilya.

--
Gustavo