Skip to content

Commit

Permalink
sound: Prevent buffer overflow in OSS load_mixer_volumes
Browse files Browse the repository at this point in the history
The load_mixer_volumes() function, which can be triggered by
unprivileged users via the SOUND_MIXER_SETLEVELS ioctl, is vulnerable to
a buffer overflow.  Because the provided "name" argument isn't
guaranteed to be NULL terminated at the expected 32 bytes, it's possible
to overflow past the end of the last element in the mixer_vols array.
Further exploitation can result in an arbitrary kernel write (via
subsequent calls to load_mixer_volumes()) leading to privilege
escalation, or arbitrary kernel reads via get_mixer_levels().  In
addition, the strcmp() may leak bytes beyond the mixer_vols array.

Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Dan Rosenberg authored and Takashi Iwai committed Dec 30, 2010
1 parent 7693457 commit d81a12b
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions sound/oss/soundcard.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ int *load_mixer_volumes(char *name, int *levels, int present)
int i, n;

for (i = 0; i < num_mixer_volumes; i++) {
if (strcmp(name, mixer_vols[i].name) == 0) {
if (strncmp(name, mixer_vols[i].name, 32) == 0) {
if (present)
mixer_vols[i].num = i;
return mixer_vols[i].levels;
Expand All @@ -99,7 +99,7 @@ int *load_mixer_volumes(char *name, int *levels, int present)
}
n = num_mixer_volumes++;

strcpy(mixer_vols[n].name, name);
strncpy(mixer_vols[n].name, name, 32);

if (present)
mixer_vols[n].num = n;
Expand Down

0 comments on commit d81a12b

Please sign in to comment.