On Thu, Feb 07, 2019 at 06:44:56PM -0600, Gustavo A. R. Silva wrote: > 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[]; > }; > > size = sizeof(struct foo) + count * sizeof(struct boo); > instance = alloc(size, GFP_KERNEL) > > Instead of leaving these open-coded and prone to type mistakes, we can > now use the new struct_size() helper: > > size = struct_size(instance, entry, count); > > This code was detected with the help of Coccinelle. > > Signed-off-by: Gustavo A. R. Silva <gustavo@xxxxxxxxxxxxxx> Acked-by: Simon Horman <horms+renesas@xxxxxxxxxxxx> Pablo, could you consider applying this? > --- > net/netfilter/ipvs/ip_vs_ctl.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c > index 7d6318664eb2..bcd9112f47d9 100644 > --- a/net/netfilter/ipvs/ip_vs_ctl.c > +++ b/net/netfilter/ipvs/ip_vs_ctl.c > @@ -2734,8 +2734,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) > int size; > > get = (struct ip_vs_get_services *)arg; > - size = sizeof(*get) + > - sizeof(struct ip_vs_service_entry) * get->num_services; > + size = struct_size(get, entrytable, get->num_services); > if (*len != size) { > pr_err("length: %u != %u\n", *len, size); > ret = -EINVAL; > @@ -2776,8 +2775,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) > int size; > > get = (struct ip_vs_get_dests *)arg; > - size = sizeof(*get) + > - sizeof(struct ip_vs_dest_entry) * get->num_dests; > + size = struct_size(get, entrytable, get->num_dests); > if (*len != size) { > pr_err("length: %u != %u\n", *len, size); > ret = -EINVAL; > -- > 2.20.1 >