net/sched: cls_u32: Use struct_size() helper
authorGustavo A. R. Silva <gustavoars@kernel.org>
Thu, 30 Jul 2020 16:03:14 +0000 (11:03 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 31 Jul 2020 23:50:39 +0000 (16:50 -0700)
Make use of the struct_size() helper, in multiple places, instead
of an open-coded version in order to avoid any potential type
mistakes and protect against potential integer overflows.

Also, remove unnecessary object identifier size.

Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/cls_u32.c

index 771b068..7b69ab1 100644 (file)
@@ -852,9 +852,6 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
        u32 htid, flags = 0;
        size_t sel_size;
        int err;
-#ifdef CONFIG_CLS_U32_PERF
-       size_t size;
-#endif
 
        if (!opt) {
                if (handle) {
@@ -1022,15 +1019,15 @@ static int u32_change(struct net *net, struct sk_buff *in_skb,
                goto erridr;
        }
 
-       n = kzalloc(offsetof(typeof(*n), sel) + sel_size, GFP_KERNEL);
+       n = kzalloc(struct_size(n, sel.keys, s->nkeys), GFP_KERNEL);
        if (n == NULL) {
                err = -ENOBUFS;
                goto erridr;
        }
 
 #ifdef CONFIG_CLS_U32_PERF
-       size = sizeof(struct tc_u32_pcnt) + s->nkeys * sizeof(u64);
-       n->pf = __alloc_percpu(size, __alignof__(struct tc_u32_pcnt));
+       n->pf = __alloc_percpu(struct_size(n->pf, kcnts, s->nkeys),
+                              __alignof__(struct tc_u32_pcnt));
        if (!n->pf) {
                err = -ENOBUFS;
                goto errfree;
@@ -1294,8 +1291,7 @@ static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh,
                int cpu;
 #endif
 
-               if (nla_put(skb, TCA_U32_SEL,
-                           sizeof(n->sel) + n->sel.nkeys*sizeof(struct tc_u32_key),
+               if (nla_put(skb, TCA_U32_SEL, struct_size(&n->sel, keys, n->sel.nkeys),
                            &n->sel))
                        goto nla_put_failure;
 
@@ -1345,9 +1341,7 @@ static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh,
                                goto nla_put_failure;
                }
 #ifdef CONFIG_CLS_U32_PERF
-               gpf = kzalloc(sizeof(struct tc_u32_pcnt) +
-                             n->sel.nkeys * sizeof(u64),
-                             GFP_KERNEL);
+               gpf = kzalloc(struct_size(gpf, kcnts, n->sel.nkeys), GFP_KERNEL);
                if (!gpf)
                        goto nla_put_failure;
 
@@ -1361,9 +1355,7 @@ static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh,
                                gpf->kcnts[i] += pf->kcnts[i];
                }
 
-               if (nla_put_64bit(skb, TCA_U32_PCNT,
-                                 sizeof(struct tc_u32_pcnt) +
-                                 n->sel.nkeys * sizeof(u64),
+               if (nla_put_64bit(skb, TCA_U32_PCNT, struct_size(gpf, kcnts, n->sel.nkeys),
                                  gpf, TCA_U32_PAD)) {
                        kfree(gpf);
                        goto nla_put_failure;