Commit 6b1e4d01 authored by Takashi Iwai's avatar Takashi Iwai Committed by Khalid Elmously

ALSA: opl3: Hardening for potential Spectre v1

As recently Smatch suggested, one place in OPL3 driver may expand the
array directly from the user-space value with speculation:
  sound/drivers/opl3/opl3_synth.c:476 snd_opl3_set_voice() warn: potential spectre issue 'snd_opl3_regmap'

This patch puts array_index_nospec() for hardening against it.

BugLink: https://marc.info/?l=linux-kernel&m=152411496503418&w=2Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>

CVE-2017-5753

(cherry picked from commit 7f054a5b)
Signed-off-by: default avatarJuerg Haefliger <juergh@canonical.com>
Acked-by: default avatarStefan Bader <stefan.bader@canonical.com>
Acked-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
parent 0bcbcb1f
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/nospec.h>
#include <sound/opl3.h> #include <sound/opl3.h>
#include <sound/asound_fm.h> #include <sound/asound_fm.h>
...@@ -448,7 +449,7 @@ static int snd_opl3_set_voice(struct snd_opl3 * opl3, struct snd_dm_fm_voice * v ...@@ -448,7 +449,7 @@ static int snd_opl3_set_voice(struct snd_opl3 * opl3, struct snd_dm_fm_voice * v
{ {
unsigned short reg_side; unsigned short reg_side;
unsigned char op_offset; unsigned char op_offset;
unsigned char voice_offset; unsigned char voice_offset, voice_op;
unsigned short opl3_reg; unsigned short opl3_reg;
unsigned char reg_val; unsigned char reg_val;
...@@ -473,7 +474,9 @@ static int snd_opl3_set_voice(struct snd_opl3 * opl3, struct snd_dm_fm_voice * v ...@@ -473,7 +474,9 @@ static int snd_opl3_set_voice(struct snd_opl3 * opl3, struct snd_dm_fm_voice * v
voice_offset = voice->voice - MAX_OPL2_VOICES; voice_offset = voice->voice - MAX_OPL2_VOICES;
} }
/* Get register offset of operator */ /* Get register offset of operator */
op_offset = snd_opl3_regmap[voice_offset][voice->op]; voice_offset = array_index_nospec(voice_offset, MAX_OPL2_VOICES);
voice_op = array_index_nospec(voice->op, 4);
op_offset = snd_opl3_regmap[voice_offset][voice_op];
reg_val = 0x00; reg_val = 0x00;
/* Set amplitude modulation (tremolo) effect */ /* Set amplitude modulation (tremolo) effect */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment