Module Name: src Committed By: nat Date: Fri Jul 28 01:36:41 UTC 2017
Modified Files: src/sys/dev: auconv.c audio.c src/sys/dev/ic: ac97.c src/sys/dev/pci: azalia_codec.c Log Message: Mixer device bounds checking. Analysis by Ilja van Sprundel. To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/sys/dev/auconv.c cvs rdiff -u -r1.371 -r1.372 src/sys/dev/audio.c cvs rdiff -u -r1.96 -r1.97 src/sys/dev/ic/ac97.c cvs rdiff -u -r1.80 -r1.81 src/sys/dev/pci/azalia_codec.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/auconv.c diff -u src/sys/dev/auconv.c:1.29 src/sys/dev/auconv.c:1.30 --- src/sys/dev/auconv.c:1.29 Thu Jul 27 23:39:37 2017 +++ src/sys/dev/auconv.c Fri Jul 28 01:36:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: auconv.c,v 1.29 2017/07/27 23:39:37 nat Exp $ */ +/* $NetBSD: auconv.c,v 1.30 2017/07/28 01:36:40 nat Exp $ */ /* * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: auconv.c,v 1.29 2017/07/27 23:39:37 nat Exp $"); +__KERNEL_RCSID(0, "$NetBSD: auconv.c,v 1.30 2017/07/28 01:36:40 nat Exp $"); #include <sys/types.h> #include <sys/audioio.h> @@ -1391,7 +1391,7 @@ int auconv_query_encoding(const struct audio_encoding_set *encodings, audio_encoding_t *aep) { - if (aep->index >= encodings->size) + if (aep->index < 0 || aep->index >= encodings->size) return EINVAL; strlcpy(aep->name, encodings->items[aep->index].name, MAX_AUDIO_DEV_LEN); Index: src/sys/dev/audio.c diff -u src/sys/dev/audio.c:1.371 src/sys/dev/audio.c:1.372 --- src/sys/dev/audio.c:1.371 Thu Jul 27 08:37:27 2017 +++ src/sys/dev/audio.c Fri Jul 28 01:36:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: audio.c,v 1.371 2017/07/27 08:37:27 isaki Exp $ */ +/* $NetBSD: audio.c,v 1.372 2017/07/28 01:36:40 nat Exp $ */ /*- * Copyright (c) 2016 Nathanial Sloss <nathanialsl...@yahoo.com.au> @@ -148,7 +148,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.371 2017/07/27 08:37:27 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.372 2017/07/28 01:36:40 nat Exp $"); #ifdef _KERNEL_OPT #include "audio.h" @@ -5127,7 +5127,7 @@ mixer_ioctl(struct audio_softc *sc, u_lo if (device_is_active(sc->sc_dev)) error = audio_get_port(sc, mc); - else if (mc->dev >= sc->sc_nmixer_states) + else if (mc->dev < 0 || mc->dev >= sc->sc_nmixer_states) error = ENXIO; else { int dev = mc->dev; Index: src/sys/dev/ic/ac97.c diff -u src/sys/dev/ic/ac97.c:1.96 src/sys/dev/ic/ac97.c:1.97 --- src/sys/dev/ic/ac97.c:1.96 Sat Apr 4 15:09:45 2015 +++ src/sys/dev/ic/ac97.c Fri Jul 28 01:36:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ac97.c,v 1.96 2015/04/04 15:09:45 christos Exp $ */ +/* $NetBSD: ac97.c,v 1.97 2017/07/28 01:36:40 nat Exp $ */ /* $OpenBSD: ac97.c,v 1.8 2000/07/19 09:01:35 csapuntz Exp $ */ /* @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ac97.c,v 1.96 2015/04/04 15:09:45 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ac97.c,v 1.97 2017/07/28 01:36:40 nat Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1677,7 +1677,7 @@ ac97_query_devinfo(struct ac97_codec_if const char *name; as = (struct ac97_softc *)codec_if; - if (dip->index < as->num_source_info) { + if (dip->index >= 0 && dip->index < as->num_source_info) { si = &as->source_info[dip->index]; dip->type = si->type; dip->mixer_class = si->mixer_class; Index: src/sys/dev/pci/azalia_codec.c diff -u src/sys/dev/pci/azalia_codec.c:1.80 src/sys/dev/pci/azalia_codec.c:1.81 --- src/sys/dev/pci/azalia_codec.c:1.80 Thu Jun 1 02:45:11 2017 +++ src/sys/dev/pci/azalia_codec.c Fri Jul 28 01:36:41 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: azalia_codec.c,v 1.80 2017/06/01 02:45:11 chs Exp $ */ +/* $NetBSD: azalia_codec.c,v 1.81 2017/07/28 01:36:41 nat Exp $ */ /*- * Copyright (c) 2005, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: azalia_codec.c,v 1.80 2017/06/01 02:45:11 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: azalia_codec.c,v 1.81 2017/07/28 01:36:41 nat Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -2062,7 +2062,7 @@ generic_set_port(codec_t *this, mixer_ct { const mixer_item_t *m; - if (mc->dev >= this->nmixers) + if (mc->dev < 0 || mc->dev >= this->nmixers) return ENXIO; m = &this->mixers[mc->dev]; if (mc->type != m->devinfo.type) @@ -2077,7 +2077,7 @@ generic_get_port(codec_t *this, mixer_ct { const mixer_item_t *m; - if (mc->dev >= this->nmixers) + if (mc->dev < 0 || mc->dev >= this->nmixers) return ENXIO; m = &this->mixers[mc->dev]; mc->type = m->devinfo.type; @@ -2312,7 +2312,7 @@ alc260_set_port(codec_t *this, mixer_ctr uint32_t value; int err; - if (mc->dev >= this->nmixers) + if (mc->dev < 0 || mc->dev >= this->nmixers) return ENXIO; m = &this->mixers[mc->dev]; if (mc->type != m->devinfo.type) @@ -2370,7 +2370,7 @@ alc260_get_port(codec_t *this, mixer_ctr { const mixer_item_t *m; - if (mc->dev >= this->nmixers) + if (mc->dev < 0 || mc->dev >= this->nmixers) return ENXIO; m = &this->mixers[mc->dev]; mc->type = m->devinfo.type; @@ -2871,7 +2871,7 @@ alc882_set_port(codec_t *this, mixer_ctr uint32_t mask, bit; int i, err; - if (mc->dev >= this->nmixers) + if (mc->dev < 0 || mc->dev >= this->nmixers) return ENXIO; m = &this->mixers[mc->dev]; if (mc->type != m->devinfo.type) @@ -2905,7 +2905,7 @@ alc882_get_port(codec_t *this, mixer_ctr uint32_t mask, bit, result; int i, err; - if (mc->dev >= this->nmixers) + if (mc->dev < 0 || mc->dev >= this->nmixers) return ENXIO; m = &this->mixers[mc->dev]; mc->type = m->devinfo.type;