FAILED: patch "[PATCH] ALSA: hda/hdmi: clamp sad_count in ELD proc write handler" failed to apply to 6.12-stable tree
Subsystems (2)
Sasha Levin
maintainerThe patch below does not apply to the 6.12-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]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.12.y
git checkout FETCH_HEAD
git cherry-pick -x b3e7ddd694f8429217ba509b55b910a0e4361dfb
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '[email protected]' --subject-prefix 'PATCH 6.12.y' 'HEAD^..'
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From b3e7ddd694f8429217ba509b55b910a0e4361dfb Mon Sep 17 00:00:00 2001
From: Peter Ujfalusi <[email protected]>
Date: Thu, 8 Oct 2026 11:51:33 +0300
Subject: [PATCH] ALSA: hda/hdmi: clamp sad_count in ELD proc write handler
snd_hdmi_write_eld_info() parses a "sad_count N" line from the root-writable ELD proc interface and assigns N directly to e->sad_count with no upper bound, unlike the per-index "sadN_*" lines a few lines below which are already bounded to ELD_MAX_SAD.
snd_hdmi_eld_update_pcm_info() later iterates
"for (i = 0; i < e->sad_count; i++)" over the fixed e->sad[ELD_MAX_SAD] array, so an oversized sad_count read from the proc file causes it to walk past the array.
Reject sad_count values above ELD_MAX_SAD, matching the existing per-index guard.
--- sound/hda/codecs/hdmi/eld.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
sound/hda/codecs/hdmi/eld.c +4 -2
@@ -155,9 +155,11 @@ void snd_hdmi_write_eld_info(struct hdmi_eld *eld, e->aud_synch_delay = val; else if (!strcmp(name, "speakers")) e->spk_alloc = val; - else if (!strcmp(name, "sad_count")) + else if (!strcmp(name, "sad_count")) { +if (val >ELD_MAX_SAD ) +continue ; e->sad_count = val; - else if (!strncmp(name, "sad", 3)) { + } else if (!strncmp(name, "sad", 3)) { sname = name +4 ; n = name[3 ] -'0' ;if (name[4 ] >='0' && name[4 ] <='9' ) {
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 1/2 ALSA: hda/hdmi: extract common interface for ELD handling
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 1b0e9d7f76c9bb6bd1a345ef033ae7fe5e77649c ]
Other HDMI-related cards (e.g. hdmi-codec) are also using the ELD. Exrtact common set of interfaces for handling the ELD.
Stable-dep-of: b3e7ddd694f8 ("ALSA: hda/hdmi: clamp sad_count in ELD proc write handler")
--- include/sound/pcm_drm_eld.h | 91 +++++++++ sound/core/pcm_drm_eld.c | 387 ++++++++++++++++++++++++++++++++++++ sound/pci/hda/Kconfig | 1 + sound/pci/hda/hda_eld.c | 385 +---------------------------------- sound/pci/hda/hda_local.h | 49 +---- sound/pci/hda/patch_hdmi.c | 6 +- 6 files changed, 494 insertions(+), 425 deletions(-)
include/sound/pcm_drm_eld.h +91 -0
@@ -2,6 +2,97 @@#ifndef __SOUND_PCM_DRM_ELD_H#define __SOUND_PCM_DRM_ELD_H +enum eld_versions { +ELD_VER_CEA_861D =2 , +ELD_VER_PARTIAL =31 , +}; + +enum cea_audio_coding_types { +AUDIO_CODING_TYPE_REF_STREAM_HEADER =0 , +AUDIO_CODING_TYPE_LPCM =1 , +AUDIO_CODING_TYPE_AC3 =2 , +AUDIO_CODING_TYPE_MPEG1 =3 , +AUDIO_CODING_TYPE_MP3 =4 , +AUDIO_CODING_TYPE_MPEG2 =5 , +AUDIO_CODING_TYPE_AACLC =6 , +AUDIO_CODING_TYPE_DTS =7 , +AUDIO_CODING_TYPE_ATRAC =8 , +AUDIO_CODING_TYPE_SACD =9 , +AUDIO_CODING_TYPE_EAC3 =10 , +AUDIO_CODING_TYPE_DTS_HD =11 , +AUDIO_CODING_TYPE_MLP =12 , +AUDIO_CODING_TYPE_DST =13 , +AUDIO_CODING_TYPE_WMAPRO =14 , +AUDIO_CODING_TYPE_REF_CXT =15 , +/* also include valid xtypes below */ +AUDIO_CODING_TYPE_HE_AAC =15 , +AUDIO_CODING_TYPE_HE_AAC2 =16 , +AUDIO_CODING_TYPE_MPEG_SURROUND =17 , +}; + +enum cea_audio_coding_xtypes { +AUDIO_CODING_XTYPE_HE_REF_CT =0 , +AUDIO_CODING_XTYPE_HE_AAC =1 , +AUDIO_CODING_XTYPE_HE_AAC2 =2 , +AUDIO_CODING_XTYPE_MPEG_SURROUND =3 , +AUDIO_CODING_XTYPE_FIRST_RESERVED =4 , +}; + +/* +* CEA Short Audio Descriptor data +*/ +struct snd_cea_sad { +int channels; +int format;/* (format == 0) indicates invalid SAD */ +int rates; +int sample_bits;/* for LPCM */ +int max_bitrate;/* for AC3...ATRAC */ +int profile;/* for WMAPRO */ +}; + +#define ELD_FIXED_BYTES 20 +#define ELD_MAX_SIZE 256 +#define ELD_MAX_MNL 16 +#define ELD_MAX_SAD 16 + +#define ELD_PCM_BITS_8 BIT(0) +#define ELD_PCM_BITS_16 BIT(1) +#define ELD_PCM_BITS_20 BIT(2) +#define ELD_PCM_BITS_24 BIT(3) +#define ELD_PCM_BITS_32 BIT(4) + +/* +* ELD: EDID Like Data +*/ +struct snd_parsed_hdmi_eld { +/* +* all fields will be cleared before updating ELD +*/ +int baseline_len; +int eld_ver; +int cea_edid_ver; +char monitor_name[ELD_MAX_MNL +1 ]; +int manufacture_id; +int product_id; +u64 port_id; +int support_hdcp; +int support_ai; +int conn_type; +int aud_synch_delay; +int spk_alloc; +int sad_count; +struct snd_cea_sad sad[ELD_MAX_SAD ]; +}; +int snd_pcm_hw_constraint_eld (struct snd_pcm_runtime *runtime,void *eld); +int snd_parse_eld (struct device *dev,struct snd_parsed_hdmi_eld *e, +const unsigned char *buf,int size); +void snd_show_eld (struct device *dev,struct snd_parsed_hdmi_eld *e); + +#ifdef CONFIG_SND_PROC_FS +void snd_print_eld_info (struct snd_parsed_hdmi_eld *eld, +struct snd_info_buffer *buffer); +#endif +#endif
sound/core/pcm_drm_eld.c +387 -0
398 lines not on this page · raw message
sound/pci/hda/Kconfig +1 -0
@@ -251,6 +251,7 @@ comment "Set to Y if you want auto-loading the codec driver" config SND_HDA_CODEC_HDMI tristate "Build HDMI/DisplayPort HD-audio codec support" select SND_DYNAMIC_MINORS + select SND_PCM_ELD help Say Y or M here to include HDMI and DisplayPort HD-audio codec support in snd-hda-intel driver. This includes all AMD/ATI,
sound/pci/hda/hda_eld.c +8 -377
452 lines not on this page · raw message
sound/pci/hda/hda_local.h +4 -45
71 lines not on this page · raw message
sound/pci/hda/patch_hdmi.c +3 -3
@@ -1520,8 +1520,8 @@ static void update_eld(struct hda_codec *codec,if (eld->eld_valid) {if (eld->eld_size <=0 || -snd_hdmi_parse_eld (codec, &eld->info, eld->eld_buffer, - eld->eld_size) <0 ) { +snd_parse_eld (hda_codec_dev (codec), &eld->info, + eld->eld_buffer, eld->eld_size) <0 ) { eld->eld_valid = false;if (repoll) { schedule_delayed_work(&per_pin->work,
@@ -1564,7 +1564,7 @@ static void update_eld(struct hda_codec *codec, pcm_jack =pin_idx_to_pcm_jack (codec, per_pin);if (eld->eld_valid) -snd_hdmi_show_eld (codec, &eld->info); +snd_show_eld (hda_codec_dev (codec), &eld->info); eld_changed = (pin_eld->eld_valid != eld->eld_valid); eld_changed |= (pin_eld->monitor_present != eld->monitor_present);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 ALSA: hda/hdmi: clamp sad_count in ELD proc write handler
From: Peter Ujfalusi <[email protected]>
[ Upstream commit b3e7ddd694f8429217ba509b55b910a0e4361dfb ]
snd_hdmi_write_eld_info() parses a "sad_count N" line from the root-writable ELD proc interface and assigns N directly to e->sad_count with no upper bound, unlike the per-index "sadN_*" lines a few lines below which are already bounded to ELD_MAX_SAD.
snd_hdmi_eld_update_pcm_info() later iterates
"for (i = 0; i < e->sad_count; i++)" over the fixed e->sad[ELD_MAX_SAD] array, so an oversized sad_count read from the proc file causes it to walk past the array.
Reject sad_count values above ELD_MAX_SAD, matching the existing per-index guard.
--- sound/pci/hda/hda_eld.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
sound/pci/hda/hda_eld.c +4 -2
@@ -156,9 +156,11 @@ void snd_hdmi_write_eld_info(struct hdmi_eld *eld, e->aud_synch_delay = val; else if (!strcmp(name, "speakers")) e->spk_alloc = val; - else if (!strcmp(name, "sad_count")) + else if (!strcmp(name, "sad_count")) { +if (val >ELD_MAX_SAD ) +continue ; e->sad_count = val; - else if (!strncmp(name, "sad", 3)) { + } else if (!strncmp(name, "sad", 3)) { sname = name +4 ; n = name[3 ] -'0' ;if (name[4 ] >='0' && name[4 ] <='9' ) {
Signature · 1 line
2.53.0