[PATCH net-next] libceph, ceph: use struct_size() in kmalloc()

Subsystems: ceph common code (libceph), the rest · Maintainers: Ilya Dryomov, Alex Markuze, Viacheslav Dubeyko, Linus Torvalds

STALE2834d

3 messages, 2 authors, 2019-01-25 · open the first message on its own page

[PATCH net-next] libceph, ceph: use struct_size() in kmalloc()

From: Gustavo A. R. Silva <hidden>
Date: 2019-01-15 20:06:47

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 <redacted>
---
 net/ceph/osdmap.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 98c0ff3d6441..48a31dc9161c 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -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);
-- 
2.20.1

Re: [PATCH net-next] libceph, ceph: use struct_size() in kmalloc()

From: Ilya Dryomov <idryomov@gmail.com>
Date: 2019-01-17 14:17:48

On Tue, Jan 15, 2019 at 8:41 PM Gustavo A. R. Silva
[off-list ref] wrote:
quoted hunk
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 <redacted>
---
 net/ceph/osdmap.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 98c0ff3d6441..48a31dc9161c 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -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);
Applied.

Thanks,

                Ilya

Re: [PATCH net-next] libceph, ceph: use struct_size() in kmalloc()

From: Gustavo A. R. Silva <hidden>
Date: 2019-01-25 03:50:29


On 1/17/19 8:17 AM, Ilya Dryomov wrote:
On Tue, Jan 15, 2019 at 8:41 PM Gustavo A. R. Silva
[off-list ref] wrote:
quoted
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 <redacted>
---
 net/ceph/osdmap.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 98c0ff3d6441..48a31dc9161c 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -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)

5 more quoted lines

Thanks, Ilya.

--
Gustavo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help