kernel: module: Use struct_size() helper
authorGustavo A. R. Silva <gustavo@embeddedor.com>
Thu, 6 Jun 2019 18:18:53 +0000 (13:18 -0500)
committerJessica Yu <jeyu@kernel.org>
Fri, 7 Jun 2019 08:56:32 +0000 (10:56 +0200)
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 module_sect_attrs {
...
        struct module_sect_attr attrs[0];
};

Make use of the struct_size() helper instead of an open-coded version
in order to avoid any potential type mistakes.

So, replace the following form:

sizeof(*sect_attrs) + nloaded * sizeof(sect_attrs->attrs[0]

with:

struct_size(sect_attrs, attrs, nloaded)

This code was detected with the help of Coccinelle.

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
kernel/module.c

index 1e7dcbe527af668d5859a2299eddd794bd833c11..1a0d8cab9eb753bb4f2287b02c14775ca0ad284a 100644 (file)
@@ -1504,8 +1504,7 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
        for (i = 0; i < info->hdr->e_shnum; i++)
                if (!sect_empty(&info->sechdrs[i]))
                        nloaded++;
-       size[0] = ALIGN(sizeof(*sect_attrs)
-                       + nloaded * sizeof(sect_attrs->attrs[0]),
+       size[0] = ALIGN(struct_size(sect_attrs, attrs, nloaded),
                        sizeof(sect_attrs->grp.attrs[0]));
        size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.attrs[0]);
        sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);