summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorariff <ariff@FreeBSD.org>2007-03-17 19:37:09 +0000
committerariff <ariff@FreeBSD.org>2007-03-17 19:37:09 +0000
commit65e47f607568a785ad5c32f31169478e322e8c7d (patch)
tree72bb53cee1349f2799004cbe97560d83af073e7d /sys/dev
parentaece76cbcdf89b80031f0e8fec536f8df7abc724 (diff)
downloadFreeBSD-src-65e47f607568a785ad5c32f31169478e322e8c7d.zip
FreeBSD-src-65e47f607568a785ad5c32f31169478e322e8c7d.tar.gz
Fix (another, more to come) ivar memory leak during driver detach.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/sound/pci/csa.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/sys/dev/sound/pci/csa.c b/sys/dev/sound/pci/csa.c
index fec5a2e..37a83c5 100644
--- a/sys/dev/sound/pci/csa.c
+++ b/sys/dev/sound/pci/csa.c
@@ -339,23 +339,31 @@ csa_detach(device_t dev)
{
csa_res *resp;
sc_p scp;
+ struct sndcard_func *func;
int err;
scp = device_get_softc(dev);
resp = &scp->res;
- err = 0;
- if (scp->midi != NULL)
+ if (scp->midi != NULL) {
+ func = device_get_ivars(scp->midi);
err = device_delete_child(dev, scp->midi);
- if (err)
- return err;
- scp->midi = NULL;
+ if (err != 0)
+ return err;
+ if (func != NULL)
+ free(func, M_DEVBUF);
+ scp->midi = NULL;
+ }
- if (scp->pcm != NULL)
+ if (scp->pcm != NULL) {
+ func = device_get_ivars(scp->pcm);
err = device_delete_child(dev, scp->pcm);
- if (err)
- return err;
- scp->pcm = NULL;
+ if (err != 0)
+ return err;
+ if (func != NULL)
+ free(func, M_DEVBUF);
+ scp->pcm = NULL;
+ }
bus_teardown_intr(dev, resp->irq, scp->ih);
bus_release_resource(dev, SYS_RES_IRQ, resp->irq_rid, resp->irq);
OpenPOWER on IntegriCloud