Module Name: src
Committed By: dholland
Date: Mon May 3 04:36:43 UTC 2010
Modified Files:
src/sys/dev/pci: azalia_codec.c
Log Message:
Fix a crash during alc888 initialization caused by holding a pointer
across realloc. Patch from Bj?rn Barkenfelt in PR kern/41957, rearranged
somewhat by myself.
To generate a diff of this commit:
cvs rdiff -u -r1.77 -r1.78 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/pci/azalia_codec.c
diff -u src/sys/dev/pci/azalia_codec.c:1.77 src/sys/dev/pci/azalia_codec.c:1.78
--- src/sys/dev/pci/azalia_codec.c:1.77 Tue Apr 7 14:47:53 2009
+++ src/sys/dev/pci/azalia_codec.c Mon May 3 04:36:43 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: azalia_codec.c,v 1.77 2009/04/07 14:47:53 stacktic Exp $ */
+/* $NetBSD: azalia_codec.c,v 1.78 2010/05/03 04:36:43 dholland Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: azalia_codec.c,v 1.77 2009/04/07 14:47:53 stacktic Exp $");
+__KERNEL_RCSID(0, "$NetBSD: azalia_codec.c,v 1.78 2010/05/03 04:36:43 dholland Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -3176,9 +3176,9 @@
static int
alc888_mixer_init(codec_t *this)
{
- mixer_item_t *m, *mdac = NULL;
+ mixer_item_t *m = NULL;
mixer_devinfo_t *d;
- int err, i;
+ int err, i, mdac_index = -1;
err = generic_mixer_init(this);
if (err)
@@ -3193,10 +3193,10 @@
/* We're looking for front l/r mixer, which we know is nid 0x0c */
for (i = 0; i < this->nmixers; i++)
if (this->mixers[i].nid == 0x0c) {
- mdac = &this->mixers[i];
+ mdac_index = i;
break;
}
- if (mdac) {
+ if (mdac_index >= 0) {
/*
* ALC888 doesn't have a master mixer, so create a fake
* inputs.dac that mirrors outputs.master
@@ -3207,7 +3207,7 @@
m = &this->mixers[this->nmixers];
d = &m->devinfo;
- memcpy(m, mdac, sizeof(*m));
+ memcpy(m, &this->mixers[mdac_index], sizeof(*m));
d->mixer_class = AZ_CLASS_INPUT;
snprintf(d->label.name, sizeof(d->label.name), AudioNdac);
this->nmixers++;