diff options
author | Takashi Iwai <tiwai@suse.de> | 2016-05-10 10:07:40 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2016-05-10 11:05:16 -0400 |
commit | 8d879be882ba5a8bd4c2bc39bd2c336392564e13 (patch) | |
tree | 14d5315cd45c1cc60fa04cc8435cadaec5f25d9a /sound/core | |
parent | 62f00e40b0718ebd8bd54fc7a9e89e873524d495 (diff) |
ALSA: pcm: Bail out when chmap is already present
When snd_pcm_add_chmap_ctls() is called to the PCM stream to which a
chmap has been already assigned, it returns as an error due to the
conflicting snd_ctl_add() result. However, this also clears the
already assigned chmap_kctl field via pcm_chmap_ctl_private_free(),
and becomes inconsistent in the later operation.
This patch adds the check of the conflicting chmap kctl before
actually trying to allocate / assign. The check failure is treated as
a kernel warning, as the double call of snd_pcm_add_chmap_ctls() is
basically a driver bug and having the stack trace would help
developers to figure out the bad code path.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core')
-rw-r--r-- | sound/core/pcm_lib.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 0aca39762ed0..bb1261591a1f 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c | |||
@@ -2595,6 +2595,8 @@ int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream, | |||
2595 | }; | 2595 | }; |
2596 | int err; | 2596 | int err; |
2597 | 2597 | ||
2598 | if (WARN_ON(pcm->streams[stream].chmap_kctl)) | ||
2599 | return -EBUSY; | ||
2598 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 2600 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
2599 | if (!info) | 2601 | if (!info) |
2600 | return -ENOMEM; | 2602 | return -ENOMEM; |