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 v4l2_subscribed_event.
Additionally, since the element count member must be set before accessing
the annotated flexible array member, move its initialization earlier.
[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
Cc: lijian <lijian@yulong.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
        sev = kvzalloc(struct_size(sev, events, elems), GFP_KERNEL);
        if (!sev)
                return -ENOMEM;
+       sev->elems = elems;
        for (i = 0; i < elems; i++)
                sev->events[i].sev = sev;
        sev->type = sub->type;
        sev->flags = sub->flags;
        sev->fh = fh;
        sev->ops = ops;
-       sev->elems = elems;
 
        mutex_lock(&fh->subscribe_lock);
 
 
        unsigned int            elems;
        unsigned int            first;
        unsigned int            in_use;
-       struct v4l2_kevent      events[];
+       struct v4l2_kevent      events[] __counted_by(elems);
 };
 
 /**