ASoC: Use __counted_by() annotation for snd_soc_pcm_runtime

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>
Link: https://patch.msgid.link/20240726155237.21961-1-tiwai@suse.de
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Takashi Iwai 2024-07-26 17:52:36 +02:00 committed by Mark Brown
parent 42eb47310f
commit aaa5e1aa39
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
2 changed files with 8 additions and 8 deletions

View File

@ -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() */

View File

@ -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);