forked from Minki/linux
ALSA: hda - hdmi: Do not expose eld data when eld is invalid
Previously, it was possible to read the eld data of the previous monitor connected. This should not be allowed. Also refactor the function slightly. Signed-off-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
bbfd8a19b6
commit
68e03de985
@ -343,14 +343,16 @@ static int hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct hdmi_spec *spec;
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
struct hdmi_eld *eld;
|
||||
int pin_idx;
|
||||
|
||||
spec = codec->spec;
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
|
||||
|
||||
pin_idx = kcontrol->private_value;
|
||||
uinfo->count = spec->pins[pin_idx].sink_eld.eld_size;
|
||||
eld = &spec->pins[pin_idx].sink_eld;
|
||||
|
||||
uinfo->count = eld->eld_valid ? eld->eld_size : 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -359,14 +361,23 @@ static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct hdmi_spec *spec;
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
struct hdmi_eld *eld;
|
||||
int pin_idx;
|
||||
|
||||
spec = codec->spec;
|
||||
pin_idx = kcontrol->private_value;
|
||||
eld = &spec->pins[pin_idx].sink_eld;
|
||||
|
||||
memcpy(ucontrol->value.bytes.data,
|
||||
spec->pins[pin_idx].sink_eld.eld_buffer, ELD_MAX_SIZE);
|
||||
if (eld->eld_size > ARRAY_SIZE(ucontrol->value.bytes.data)) {
|
||||
snd_BUG();
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(ucontrol->value.bytes.data, 0,
|
||||
ARRAY_SIZE(ucontrol->value.bytes.data));
|
||||
if (eld->eld_valid)
|
||||
memcpy(ucontrol->value.bytes.data, eld->eld_buffer,
|
||||
eld->eld_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user