Message ID | 20190208004456.GA15845@embeddedor |
---|---|
State | Accepted |
Delegated to: | Pablo Neira |
Headers | show |
Series | [net-next] ipvs: Use struct_size() helper | expand |
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@embeddedor.com> Acked-by: Simon Horman <horms+renesas@verge.net.au> 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 >
On Fri, Feb 08, 2019 at 10:56:48AM +0100, Simon Horman wrote: > 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@embeddedor.com> > > Acked-by: Simon Horman <horms+renesas@verge.net.au> > > Pablo, could you consider applying this? Applied, thanks!
On 2/11/19 5:40 PM, Pablo Neira Ayuso wrote: > On Fri, Feb 08, 2019 at 10:56:48AM +0100, Simon Horman wrote: >> 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@embeddedor.com> >> >> Acked-by: Simon Horman <horms+renesas@verge.net.au> >> >> Pablo, could you consider applying this? > > Applied, thanks! > Thank you both, Simon and Pablo. -- Gustavo
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;
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@embeddedor.com> --- net/netfilter/ipvs/ip_vs_ctl.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)