media: v4l2-event: Annotate struct v4l2_subscribed_event 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 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>
This commit is contained in:
Kees Cook 2023-09-22 10:49:52 -07:00 committed by Hans Verkuil
parent d425557814
commit 54b6b605b9
2 changed files with 2 additions and 2 deletions

View File

@ -238,6 +238,7 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
sev = kvzalloc(struct_size(sev, events, elems), GFP_KERNEL); sev = kvzalloc(struct_size(sev, events, elems), GFP_KERNEL);
if (!sev) if (!sev)
return -ENOMEM; return -ENOMEM;
sev->elems = elems;
for (i = 0; i < elems; i++) for (i = 0; i < elems; i++)
sev->events[i].sev = sev; sev->events[i].sev = sev;
sev->type = sub->type; sev->type = sub->type;
@ -245,7 +246,6 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
sev->flags = sub->flags; sev->flags = sub->flags;
sev->fh = fh; sev->fh = fh;
sev->ops = ops; sev->ops = ops;
sev->elems = elems;
mutex_lock(&fh->subscribe_lock); mutex_lock(&fh->subscribe_lock);

View File

@ -78,7 +78,7 @@ struct v4l2_subscribed_event {
unsigned int elems; unsigned int elems;
unsigned int first; unsigned int first;
unsigned int in_use; unsigned int in_use;
struct v4l2_kevent events[]; struct v4l2_kevent events[] __counted_by(elems);
}; };
/** /**