From f9e40dc81261c1a04ec8637244dcaa443db95e30 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 29 Mar 2022 12:55:10 +0200 Subject: [PATCH] Revert "ALSA: pcm: Fix races among concurrent prepare and hw_params/hw_free calls" This reverts commit cb6a39c5ebd0a125c420c5a10999813daaece019. It will come back after the next ABI break as it is needed to resolve CVE-2022-1048. But for now, while testing, it can be reverted in order to preserve the ABI. Signed-off-by: Greg Kroah-Hartman Change-Id: I52c67352b87bc95efab566d76f95d5466a61da64 --- sound/core/pcm_native.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 5cac630a141c..9ea2dbbd91aa 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -1177,17 +1177,15 @@ struct action_ops { static int snd_pcm_action_group(const struct action_ops *ops, struct snd_pcm_substream *substream, snd_pcm_state_t state, - bool stream_lock) + bool do_lock) { struct snd_pcm_substream *s = NULL; struct snd_pcm_substream *s1; int res = 0, depth = 1; snd_pcm_group_for_each_entry(s, substream) { - if (s != substream) { - if (!stream_lock) - mutex_lock_nested(&s->runtime->buffer_mutex, depth); - else if (s->pcm->nonatomic) + if (do_lock && s != substream) { + if (s->pcm->nonatomic) mutex_lock_nested(&s->self_group.mutex, depth); else spin_lock_nested(&s->self_group.lock, depth); @@ -1215,18 +1213,18 @@ static int snd_pcm_action_group(const struct action_ops *ops, ops->post_action(s, state); } _unlock: - /* unlock streams */ - snd_pcm_group_for_each_entry(s1, substream) { - if (s1 != substream) { - if (!stream_lock) - mutex_unlock(&s1->runtime->buffer_mutex); - else if (s1->pcm->nonatomic) - mutex_unlock(&s1->self_group.mutex); - else - spin_unlock(&s1->self_group.lock); + if (do_lock) { + /* unlock streams */ + snd_pcm_group_for_each_entry(s1, substream) { + if (s1 != substream) { + if (s1->pcm->nonatomic) + mutex_unlock(&s1->self_group.mutex); + else + spin_unlock(&s1->self_group.lock); + } + if (s1 == s) /* end */ + break; } - if (s1 == s) /* end */ - break; } return res; } @@ -1356,12 +1354,10 @@ static int snd_pcm_action_nonatomic(const struct action_ops *ops, /* Guarantee the group members won't change during non-atomic action */ down_read(&snd_pcm_link_rwsem); - mutex_lock(&substream->runtime->buffer_mutex); if (snd_pcm_stream_linked(substream)) res = snd_pcm_action_group(ops, substream, state, false); else res = snd_pcm_action_single(ops, substream, state); - mutex_unlock(&substream->runtime->buffer_mutex); up_read(&snd_pcm_link_rwsem); return res; }