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:
David Henningsson 2013-02-19 16:11:23 +01:00 committed by Takashi Iwai
parent bbfd8a19b6
commit 68e03de985

View File

@ -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;
}