Commit f5cc9cdf authored by Kees Cook's avatar Kees Cook Committed by Takashi Iwai
Browse files

ALSA: usx2y: Annotate struct snd_usx2y_urb_seq 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 snd_usx2y_urb_seq.
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: Jaroslav Kysela <perex@perex.cz>
Cc: Takashi Iwai <tiwai@suse.com>
Cc: alsa-devel@alsa-project.org
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20230922175046.work.766-kees@kernel.org


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 81420faf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ struct snd_usx2y_async_seq {
struct snd_usx2y_urb_seq {
	int	submitted;
	int	len;
	struct urb	*urb[];
	struct urb	*urb[] __counted_by(len);
};

#include "usx2yhwdeppcm.h"
+1 −1
Original line number Diff line number Diff line
@@ -681,6 +681,7 @@ static int usx2y_rate_set(struct usx2ydev *usx2y, int rate)
			err = -ENOMEM;
			goto cleanup;
		}
		us->len = NOOF_SETRATE_URBS;
		usbdata = kmalloc_array(NOOF_SETRATE_URBS, sizeof(int),
					GFP_KERNEL);
		if (!usbdata) {
@@ -702,7 +703,6 @@ static int usx2y_rate_set(struct usx2ydev *usx2y, int rate)
		if (err < 0)
			goto cleanup;
		us->submitted =	0;
		us->len =	NOOF_SETRATE_URBS;
		usx2y->us04 =	us;
		wait_event_timeout(usx2y->in04_wait_queue, !us->len, HZ);
		usx2y->us04 =	NULL;