diff options
author | ariff <ariff@FreeBSD.org> | 2007-03-17 19:37:09 +0000 |
---|---|---|
committer | ariff <ariff@FreeBSD.org> | 2007-03-17 19:37:09 +0000 |
commit | 65e47f607568a785ad5c32f31169478e322e8c7d (patch) | |
tree | 72bb53cee1349f2799004cbe97560d83af073e7d | |
parent | aece76cbcdf89b80031f0e8fec536f8df7abc724 (diff) | |
download | FreeBSD-src-65e47f607568a785ad5c32f31169478e322e8c7d.zip FreeBSD-src-65e47f607568a785ad5c32f31169478e322e8c7d.tar.gz |
Fix (another, more to come) ivar memory leak during driver detach.
-rw-r--r-- | sys/dev/sound/pci/csa.c | 26 |
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); |