--- /dev/null
+From 56b88b50565cd8b946a2d00b0c83927b7ebb055e Mon Sep 17 00:00:00 2001
+From: Clement Lecigne <clecigne@google.com>
+Date: Fri, 13 Jan 2023 13:07:45 +0100
+Subject: ALSA: pcm: Move rwsem lock inside snd_ctl_elem_read to prevent UAF
+
+From: Clement Lecigne <clecigne@google.com>
+
+[ Note: this is a fix that works around the bug equivalently as the
+ two upstream commits:
+ 1fa4445f9adf ("ALSA: control - introduce snd_ctl_notify_one() helper")
+ 56b88b50565c ("ALSA: pcm: Move rwsem lock inside snd_ctl_elem_read to prevent UAF")
+ but in a simpler way to fit with older stable trees -- tiwai ]
+
+Add missing locking in ctl_elem_read_user/ctl_elem_write_user which can be
+easily triggered and turned into an use-after-free.
+
+Example code paths with SNDRV_CTL_IOCTL_ELEM_READ:
+
+64-bits:
+snd_ctl_ioctl
+ snd_ctl_elem_read_user
+ [takes controls_rwsem]
+ snd_ctl_elem_read [lock properly held, all good]
+ [drops controls_rwsem]
+
+32-bits (compat):
+snd_ctl_ioctl_compat
+ snd_ctl_elem_write_read_compat
+ ctl_elem_write_read
+ snd_ctl_elem_read [missing lock, not good]
+
+CVE-2023-0266 was assigned for this issue.
+
+Signed-off-by: Clement Lecigne <clecigne@google.com>
+Cc: stable@kernel.org # 5.12 and older
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Reviewed-by: Jaroslav Kysela <perex@perex.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ sound/core/control_compat.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/sound/core/control_compat.c
++++ b/sound/core/control_compat.c
+@@ -319,7 +319,9 @@ static int ctl_elem_read_user(struct snd
+ err = snd_power_wait(card, SNDRV_CTL_POWER_D0);
+ if (err < 0)
+ goto error;
++ down_read(&card->controls_rwsem);
+ err = snd_ctl_elem_read(card, data);
++ up_read(&card->controls_rwsem);
+ if (err < 0)
+ goto error;
+ err = copy_ctl_value_to_user(userdata, valuep, data, type, count);
+@@ -347,7 +349,9 @@ static int ctl_elem_write_user(struct sn
+ err = snd_power_wait(card, SNDRV_CTL_POWER_D0);
+ if (err < 0)
+ goto error;
++ down_write(&card->controls_rwsem);
+ err = snd_ctl_elem_write(card, file, data);
++ up_write(&card->controls_rwsem);
+ if (err < 0)
+ goto error;
+ err = copy_ctl_value_to_user(userdata, valuep, data, type, count);