forked from luck/tmp_suning_uos_patched
ALSA: control: Hardening for potential Spectre v1
As recently Smatch suggested, a few places in ALSA control core codes may expand the array directly from the user-space value with speculation: sound/core/control.c:1003 snd_ctl_elem_lock() warn: potential spectre issue 'kctl->vd' sound/core/control.c:1031 snd_ctl_elem_unlock() warn: potential spectre issue 'kctl->vd' sound/core/control.c:844 snd_ctl_elem_info() warn: potential spectre issue 'kctl->vd' sound/core/control.c:891 snd_ctl_elem_read() warn: potential spectre issue 'kctl->vd' sound/core/control.c:939 snd_ctl_elem_write() warn: potential spectre issue 'kctl->vd' Although all these seem doing only the first load without further reference, we may want to stay in a safer side, so hardening with array_index_nospec() would still make sense. In this patch, we put array_index_nospec() to the common snd_ctl_get_ioff*() helpers instead of each caller. These helpers are also referred from some drivers, too, and basically all usages are to calculate the array index from the user-space value, hence it's better to cover there. BugLink: https://marc.info/?l=linux-kernel&m=152411496503418&w=2 Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
8d218dd811
commit
088e861edf
|
@ -23,6 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
#include <sound/asound.h>
|
#include <sound/asound.h>
|
||||||
|
|
||||||
#define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data)
|
#define snd_kcontrol_chip(kcontrol) ((kcontrol)->private_data)
|
||||||
|
@ -148,12 +149,14 @@ int snd_ctl_get_preferred_subdevice(struct snd_card *card, int type);
|
||||||
|
|
||||||
static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
static inline unsigned int snd_ctl_get_ioffnum(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
||||||
{
|
{
|
||||||
return id->numid - kctl->id.numid;
|
unsigned int ioff = id->numid - kctl->id.numid;
|
||||||
|
return array_index_nospec(ioff, kctl->count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
static inline unsigned int snd_ctl_get_ioffidx(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
||||||
{
|
{
|
||||||
return id->index - kctl->id.index;
|
unsigned int ioff = id->index - kctl->id.index;
|
||||||
|
return array_index_nospec(ioff, kctl->count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int snd_ctl_get_ioff(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
static inline unsigned int snd_ctl_get_ioff(struct snd_kcontrol *kctl, struct snd_ctl_elem_id *id)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user