Patch "ALSA: aloop: Sync stale timer before release" has been added to the 4.15-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ALSA: aloop: Sync stale timer before release
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
alsa-aloop-sync-stale-timer-before-release.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
67a01afaf3d34893cf7d2ea19b34555d6abb7cb0Mon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Thu, 22 Mar 2018 08:56:06 +0100
Subject: ALSA: aloop: Sync stale timer before release
From: Takashi Iwai <[email protected]>
commit 67a01afaf3d34893cf7d2ea19b34555d6abb7cb0 upstream.
The aloop driver tries to stop the pending timer via timer_del() in the trigger callback and in the close callback. The former is correct, as it's an atomic operation, while the latter expects that the timer gets really removed and proceeds the resource releases after that. But timer_del() doesn't synchronize, hence the running timer may still access the released resources.
A similar situation can be also seen in the prepare callback after trigger(STOP) where the prepare tries to re-initialize the things while a timer is still running.
The problems like the above are seen indirectly in some syzkaller reports (although it's not 100% clear whether this is the only cause, as the race condition is quite narrow and not always easy to trigger).
For addressing these issues, this patch adds the explicit alls of timer_del_sync() in some places, so that the pending timer is properly killed / synced.
--- sound/drivers/aloop.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
sound/drivers/aloop.c +8 -1
@@ -192,6 +192,11 @@ static inline void loopback_timer_stop(s dpcm->timer.expires =0 ; } +static inline void loopback_timer_stop_sync (struct loopback_pcm *dpcm) +{ +del_timer_sync (&dpcm->timer); +} +#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK)#define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE)#define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE)
@@ -326,6 +331,8 @@ static int loopback_prepare(struct snd_pstruct loopback_cable *cable = dpcm->cable;int bps, salign; +loopback_timer_stop_sync (dpcm); + salign = (snd_pcm_format_width (runtime->format) * runtime->channels) /8 ; bps = salign * runtime->rate;
@@ -744,7 +751,7 @@ static int loopback_close(struct snd_pcmstruct loopback *loopback = substream->private_data;struct loopback_pcm *dpcm = substream->runtime->private_data; -loopback_timer_stop (dpcm); +loopback_timer_stop_sync (dpcm);mutex_lock (&loopback->cable_lock);free_cable (substream);mutex_unlock (&loopback->cable_lock);
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/alsa-aloop-fix-access-to-not-yet-ready-substream-via-cable.patch queue-4.15/alsa-hda-realtek-fix-speaker-no-sound-after-system-resume.patch queue-4.15/alsa-hda-realtek-fix-dell-headset-mic-can-t-record.patch queue-4.15/alsa-hda-realtek-always-immediately-update-mute-led-with-pin-vref.patch queue-4.15/alsa-usb-audio-fix-parsing-descriptor-of-uac2-processing-unit.patch queue-4.15/alsa-aloop-sync-stale-timer-before-release.patch queue-4.15/alsa-hda-force-polling-mode-on-cfl-for-fixing-codec-communication.patch