Commit 1e63e5a8 authored by Kees Cook's avatar Kees Cook Committed by David S. Miller

net: sched: Annotate struct tc_pedit with __counted_by

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct tc_pedit.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.

Link: https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci [1]
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
Acked-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent da4a154c
...@@ -62,7 +62,7 @@ struct tc_pedit_sel { ...@@ -62,7 +62,7 @@ struct tc_pedit_sel {
tc_gen; tc_gen;
unsigned char nkeys; unsigned char nkeys;
unsigned char flags; unsigned char flags;
struct tc_pedit_key keys[0]; struct tc_pedit_key keys[] __counted_by(nkeys);
}; };
#define tc_pedit tc_pedit_sel #define tc_pedit tc_pedit_sel
......
...@@ -515,11 +515,11 @@ static int tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a, ...@@ -515,11 +515,11 @@ static int tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a,
spin_unlock_bh(&p->tcf_lock); spin_unlock_bh(&p->tcf_lock);
return -ENOBUFS; return -ENOBUFS;
} }
opt->nkeys = parms->tcfp_nkeys;
memcpy(opt->keys, parms->tcfp_keys, memcpy(opt->keys, parms->tcfp_keys,
flex_array_size(opt, keys, parms->tcfp_nkeys)); flex_array_size(opt, keys, parms->tcfp_nkeys));
opt->index = p->tcf_index; opt->index = p->tcf_index;
opt->nkeys = parms->tcfp_nkeys;
opt->flags = parms->tcfp_flags; opt->flags = parms->tcfp_flags;
opt->action = p->tcf_action; opt->action = p->tcf_action;
opt->refcnt = refcount_read(&p->tcf_refcnt) - ref; opt->refcnt = refcount_read(&p->tcf_refcnt) - ref;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment