FAILED: patch "[PATCH] ALSA: hda/hdmi: fix incorrect locking in hdmi_pcm_close" failed to apply to 4.19-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From ce1558c285f9ad04c03b46833a028230771cc0a7 Mon Sep 17 00:00:00 2001
From: Kai Vehmanen <[email protected]>
Date: Tue, 13 Oct 2020 18:26:28 +0300
Subject: [PATCH] ALSA: hda/hdmi: fix incorrect locking in hdmi_pcm_close
A race exists between closing a PCM and update of ELD data. In hdmi_pcm_close(), hinfo->nid value is modified without taking spec->pcm_lock. If this happens concurrently while processing an ELD update in hdmi_pcm_setup_pin(), converter assignment may be done incorrectly.
This bug was found by hitting a WARN_ON in snd_hda_spdif_ctls_assign() in a HDMI receiver connection stress test:
[2739.684569] WARNING: CPU: 5 PID: 2090 at sound/pci/hda/patch_hdmi.c:1898 check_non_pcm_per_cvt+0x41/0x50 [snd_hda_codec_hdmi] ... [2739.684707] Call Trace: [2739.684720] update_eld+0x121/0x5a0 [snd_hda_codec_hdmi] [2739.684736] hdmi_present_sense+0x21e/0x3b0 [snd_hda_codec_hdmi] [2739.684750] check_presence_and_report+0x81/0xd0 [snd_hda_codec_hdmi] [2739.684842] intel_audio_codec_enable+0x122/0x190 [i915]
sound/pci/hda/patch_hdmi.c +12 -8
@@ -2046,22 +2046,25 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,int pinctl;int err =0 ; +mutex_lock (&spec->pcm_lock);if (hinfo->nid) { pcm_idx =hinfo_to_pcm_index (codec, hinfo); -if (snd_BUG_ON (pcm_idx <0 )) -return -EINVAL ; +if (snd_BUG_ON (pcm_idx <0 )) { + err = -EINVAL ; + goto unlock; + } cvt_idx =cvt_nid_to_cvt_index (codec, hinfo->nid); -if (snd_BUG_ON (cvt_idx <0 )) -return -EINVAL ; +if (snd_BUG_ON (cvt_idx <0 )) { + err = -EINVAL ; + goto unlock; + } per_cvt =get_cvt (spec, cvt_idx); -snd_BUG_ON (!per_cvt->assigned); per_cvt->assigned =0 ; hinfo->nid =0 ;azx_stream (get_azx_dev (substream))->stripe =0 ; -mutex_lock (&spec->pcm_lock);snd_hda_spdif_ctls_unassign (codec, pcm_idx);clear_bit (pcm_idx, &spec->pcm_in_use); pin_idx =hinfo_to_pin_index (codec, hinfo);
@@ -2091,10 +2094,11 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, per_pin->setup = false; per_pin->channels =0 ;mutex_unlock (&per_pin->lock); - unlock: -mutex_unlock (&spec->pcm_lock); } +unlock: +mutex_unlock (&spec->pcm_lock); +return err; }
Hi Greg,
Quoted 5 lines · On Sat, Oct 17, 2020 at 01:21:38PM +0200, [email protected] wrote:
The patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Here is the backport.
--
Regards
Sudip
From df2cb010461bb17851b0d1bb698f687d1a2ad5ce Mon Sep 17 00:00:00 2001
From: Kai Vehmanen <[email protected]>
Date: Tue, 13 Oct 2020 18:26:28 +0300
Subject: [PATCH] ALSA: hda/hdmi: fix incorrect locking in hdmi_pcm_close
commit ce1558c285f9ad04c03b46833a028230771cc0a7 upstream
A race exists between closing a PCM and update of ELD data. In hdmi_pcm_close(), hinfo->nid value is modified without taking spec->pcm_lock. If this happens concurrently while processing an ELD update in hdmi_pcm_setup_pin(), converter assignment may be done incorrectly.
This bug was found by hitting a WARN_ON in snd_hda_spdif_ctls_assign() in a HDMI receiver connection stress test:
[2739.684569] WARNING: CPU: 5 PID: 2090 at sound/pci/hda/patch_hdmi.c:1898 check_non_pcm_per_cvt+0x41/0x50 [snd_hda_codec_hdmi] ... [2739.684707] Call Trace: [2739.684720] update_eld+0x121/0x5a0 [snd_hda_codec_hdmi] [2739.684736] hdmi_present_sense+0x21e/0x3b0 [snd_hda_codec_hdmi] [2739.684750] check_presence_and_report+0x81/0xd0 [snd_hda_codec_hdmi] [2739.684842] intel_audio_codec_enable+0x122/0x190 [i915]
--- sound/pci/hda/patch_hdmi.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
sound/pci/hda/patch_hdmi.c +12 -8
@@ -1955,20 +1955,23 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,int pinctl;int err =0 ; +mutex_lock (&spec->pcm_lock);if (hinfo->nid) { pcm_idx =hinfo_to_pcm_index (codec, hinfo); -if (snd_BUG_ON (pcm_idx <0 )) -return -EINVAL ; +if (snd_BUG_ON (pcm_idx <0 )) { + err = -EINVAL ; + goto unlock; + } cvt_idx =cvt_nid_to_cvt_index (codec, hinfo->nid); -if (snd_BUG_ON (cvt_idx <0 )) -return -EINVAL ; +if (snd_BUG_ON (cvt_idx <0 )) { + err = -EINVAL ; + goto unlock; + } per_cvt =get_cvt (spec, cvt_idx); -snd_BUG_ON (!per_cvt->assigned); per_cvt->assigned =0 ; hinfo->nid =0 ; -mutex_lock (&spec->pcm_lock);snd_hda_spdif_ctls_unassign (codec, pcm_idx);clear_bit (pcm_idx, &spec->pcm_in_use); pin_idx =hinfo_to_pin_index (codec, hinfo);
@@ -1996,10 +1999,11 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, per_pin->setup = false; per_pin->channels =0 ;mutex_unlock (&per_pin->lock); - unlock: -mutex_unlock (&spec->pcm_lock); } +unlock: +mutex_unlock (&spec->pcm_lock); +return err; }
Signature · 1 line
2.11.0
Greg KH
maintainerQuoted 10 lines · Sudip Mukherjee
Hi Greg,
Quoted 5 lines · On Sat, Oct 17, 2020 at 01:21:38PM +0200, [email protected] wrote:
The patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.Here is the backport.
All now applied, thanks!
greg k-h