mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 02:36:21 +00:00
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:
parent
42eb47310f
commit
aaa5e1aa39
@ -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() */
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user