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;

Reply via email to