aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Rosenberg <drosenberg@vsecurity.com>2010-12-25 16:23:40 -0500
committerWilly Tarreau <w@1wt.eu>2012-04-09 14:19:53 +0200
commit9a38dd0b5527eab772d2a2969e72d67666b029d6 (patch)
treeb0581b83419f92d35112060255608566d1911891
parenta61eed7f742c596ad18f423be576563ac9d59c11 (diff)
downloadlinux-2.4-9a38dd0b5527eab772d2a2969e72d67666b029d6.tar.gz
Prevent buffer overflow in OSS load_mixer_volumes
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: Willy Tarreau <w@1wt.eu>
-rw-r--r--drivers/sound/soundcard.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/sound/soundcard.c b/drivers/sound/soundcard.c
index 55a99a5e75e45..42cd33369700a 100644
--- a/drivers/sound/soundcard.c
+++ b/drivers/sound/soundcard.c
@@ -86,7 +86,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;
@@ -98,7 +98,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;