diff mbox series

ASoC: Use __counted_by() annotation for snd_soc_pcm_runtime

Message ID 20240726155237.21961-1-tiwai@suse.de (mailing list archive)
State Accepted
Commit aaa5e1aa39074fb466f6ef3df4de6903741dfeec
Headers show
Series ASoC: Use __counted_by() annotation for snd_soc_pcm_runtime | expand

Commit Message

Takashi Iwai July 26, 2024, 3:52 p.m. UTC
The struct snd_soc_pcm_runtime has a flex array of snd_soc_component
objects at its end, and the size is kept in num_components field.
We can add __counted_by() annotation for compiler's assistance to
catch array overflows.

A slight additional change is the assignment of rtd->components[];
the array counter has to be incremented at first for avoiding
false-positive reports from compilers.

Also, the allocation size of snd_soc_pcm_runtime is cleaned up with
the standard struct_size() helper, too.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---

Another missing one in sound/*.  It'd be appreciated if anyone can
actually check this annotation.

 include/sound/soc.h  |  3 ++-
 sound/soc/soc-core.c | 13 ++++++-------
 2 files changed, 8 insertions(+), 8 deletions(-)

Comments

Mark Brown July 29, 2024, 5:17 p.m. UTC | #1
On Fri, 26 Jul 2024 17:52:36 +0200, Takashi Iwai wrote:
> The struct snd_soc_pcm_runtime has a flex array of snd_soc_component
> objects at its end, and the size is kept in num_components field.
> We can add __counted_by() annotation for compiler's assistance to
> catch array overflows.
> 
> A slight additional change is the assignment of rtd->components[];
> the array counter has to be incremented at first for avoiding
> false-positive reports from compilers.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: Use __counted_by() annotation for snd_soc_pcm_runtime
      commit: aaa5e1aa39074fb466f6ef3df4de6903741dfeec

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
diff mbox series

Patch

diff --git a/include/sound/soc.h b/include/sound/soc.h
index a8e66bbf932b..e844f6afc5b5 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -1209,8 +1209,9 @@  struct snd_soc_pcm_runtime {
 
 	bool initialized;
 
+	/* CPU/Codec/Platform */
 	int num_components;
-	struct snd_soc_component *components[]; /* CPU/Codec/Platform */
+	struct snd_soc_component *components[] __counted_by(num_components);
 };
 
 /* see soc_new_pcm_runtime()  */
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 724fe1f033b5..80bacea6bb90 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -326,8 +326,8 @@  static int snd_soc_rtd_add_component(struct snd_soc_pcm_runtime *rtd,
 	}
 
 	/* see for_each_rtd_components */
-	rtd->components[rtd->num_components] = component;
-	rtd->num_components++;
+	rtd->num_components++; // increment flex array count at first
+	rtd->components[rtd->num_components - 1] = component;
 
 	return 0;
 }
@@ -494,7 +494,6 @@  static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
 	struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
 {
 	struct snd_soc_pcm_runtime *rtd;
-	struct snd_soc_component *component;
 	struct device *dev;
 	int ret;
 	int stream;
@@ -521,10 +520,10 @@  static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
 	 * for rtd
 	 */
 	rtd = devm_kzalloc(dev,
-			   sizeof(*rtd) +
-			   sizeof(component) * (dai_link->num_cpus +
-						 dai_link->num_codecs +
-						 dai_link->num_platforms),
+			   struct_size(rtd, components,
+				       dai_link->num_cpus +
+				       dai_link->num_codecs +
+				       dai_link->num_platforms),
 			   GFP_KERNEL);
 	if (!rtd) {
 		device_unregister(dev);