libceph, ceph: use struct_size() in kmalloc()
Subsystems (3)
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
@@ -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
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.
Signed-off-by Gustavo A. R. Silva <[email protected]>--- net/ceph/osdmap.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)net/ceph/osdmap.c +0
-0@@ -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
-3goto 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
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.
Signed-off-by Gustavo A. R. Silva <[email protected]>--- net/ceph/osdmap.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)net/ceph/osdmap.c +0
-2@@ -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