diff options
author | Takashi Iwai <tiwai@suse.de> | 2016-03-10 15:49:35 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2016-03-10 15:54:42 +0100 |
commit | 1a414f48d7ccb197b61c18888b72327c98171844 (patch) | |
tree | 49bfce24deaa299602ebf9d0e3d52da40a611944 /sound/hda/hdac_i915.c | |
parent | 8cc1a8ab477e974a3516e73276ef4b6e546c4c65 (diff) | |
download | lwn-1a414f48d7ccb197b61c18888b72327c98171844.tar.gz lwn-1a414f48d7ccb197b61c18888b72327c98171844.zip |
ALSA: hda - Add a sanity check of pin / port mapping on i915 HDMI/DP
There is an implicit rule to map between pin NID and port number on
Intel HDMI/DP codec: the mapping is fixed only for NID 0x05, 0x06 and
0x07. For avoiding the possible memory corruption, add a sanity check
for the NID value and splat WARN_ON() for invalid accesses.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/hda/hdac_i915.c')
-rw-r--r-- | sound/hda/hdac_i915.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c index f6854dbd7d8d..fb96aead8257 100644 --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c @@ -126,6 +126,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_get_display_clk); */ static int pin2port(hda_nid_t pin_nid) { + if (WARN_ON(pin_nid < 5 || pin_nid > 7)) + return -1; return pin_nid - 4; } @@ -144,10 +146,14 @@ static int pin2port(hda_nid_t pin_nid) int snd_hdac_sync_audio_rate(struct hdac_bus *bus, hda_nid_t nid, int rate) { struct i915_audio_component *acomp = bus->audio_component; + int port; if (!acomp || !acomp->ops || !acomp->ops->sync_audio_rate) return -ENODEV; - return acomp->ops->sync_audio_rate(acomp->dev, pin2port(nid), rate); + port = pin2port(nid); + if (port < 0) + return -EINVAL; + return acomp->ops->sync_audio_rate(acomp->dev, port, rate); } EXPORT_SYMBOL_GPL(snd_hdac_sync_audio_rate); @@ -175,11 +181,15 @@ int snd_hdac_acomp_get_eld(struct hdac_bus *bus, hda_nid_t nid, bool *audio_enabled, char *buffer, int max_bytes) { struct i915_audio_component *acomp = bus->audio_component; + int port; if (!acomp || !acomp->ops || !acomp->ops->get_eld) return -ENODEV; - return acomp->ops->get_eld(acomp->dev, pin2port(nid), audio_enabled, + port = pin2port(nid); + if (port < 0) + return -EINVAL; + return acomp->ops->get_eld(acomp->dev, port, audio_enabled, buffer, max_bytes); } EXPORT_SYMBOL_GPL(snd_hdac_acomp_get_eld); |