Module Name: src Committed By: rin Date: Sun May 29 10:45:05 UTC 2022
Modified Files: src/sys/arch/evbppc/explora/dev: le_elb.c src/sys/arch/mipsco/obio: if_le.c src/sys/arch/mvme68k/dev: if_le.c src/sys/arch/sparc/dev: if_le_obio.c src/sys/arch/vax/if: if_le_vsbus.c Log Message: le(4): Fix resource leaks for error paths. XXX Compile test only (at least one arch per driver). To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbppc/explora/dev/le_elb.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/mipsco/obio/if_le.c cvs rdiff -u -r1.36 -r1.37 src/sys/arch/mvme68k/dev/if_le.c cvs rdiff -u -r1.28 -r1.29 src/sys/arch/sparc/dev/if_le_obio.c cvs rdiff -u -r1.28 -r1.29 src/sys/arch/vax/if/if_le_vsbus.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/arch/evbppc/explora/dev/le_elb.c diff -u src/sys/arch/evbppc/explora/dev/le_elb.c:1.11 src/sys/arch/evbppc/explora/dev/le_elb.c:1.12 --- src/sys/arch/evbppc/explora/dev/le_elb.c:1.11 Wed Dec 8 20:50:02 2021 +++ src/sys/arch/evbppc/explora/dev/le_elb.c Sun May 29 10:45:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: le_elb.c,v 1.11 2021/12/08 20:50:02 andvar Exp $ */ +/* $NetBSD: le_elb.c,v 1.12 2022/05/29 10:45:05 rin Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: le_elb.c,v 1.11 2021/12/08 20:50:02 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: le_elb.c,v 1.12 2022/05/29 10:45:05 rin Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -116,13 +116,13 @@ le_elb_attach(device_t parent, device_t if (bus_dmamem_alloc(msc->sc_dmat, LE_MEMSIZE, PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) { aprint_error_dev(self, "couldn't allocate memory for card\n"); - return; + goto bad_bsunmap; } if (bus_dmamem_map(msc->sc_dmat, &seg, rseg, LE_MEMSIZE, (void **)&sc->sc_mem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { aprint_error_dev(self, "couldn't map memory for card\n"); - return; + goto bad_free; } /* @@ -131,14 +131,12 @@ le_elb_attach(device_t parent, device_t if (bus_dmamap_create(msc->sc_dmat, LE_MEMSIZE, 1, LE_MEMSIZE, 0, BUS_DMA_NOWAIT, &msc->sc_dmam)) { aprint_error_dev(self, "couldn't create DMA map\n"); - bus_dmamem_free(msc->sc_dmat, &seg, rseg); - return; + goto bad_unmap; } if (bus_dmamap_load(msc->sc_dmat, msc->sc_dmam, sc->sc_mem, LE_MEMSIZE, NULL, BUS_DMA_NOWAIT)) { aprint_error_dev(self, "couldn't load DMA map\n"); - bus_dmamem_free(msc->sc_dmat, &seg, rseg); - return; + goto bad_destroy; } /* @@ -172,6 +170,17 @@ le_elb_attach(device_t parent, device_t intr_establish_xname(eaa->elb_irq, IST_LEVEL, IPL_NET, am79900_intr, sc, device_xname(self)); + + return; + + bad_destroy: + bus_dmamap_destroy(msc->sc_dmat, msc->sc_dmam); + bad_unmap: + bus_dmamem_unmap(msc->sc_dmat, sc->sc_mem, LE_MEMSIZE); + bad_free: + bus_dmamem_free(msc->sc_dmat, &seg, rseg); + bad_bsunmap: + bus_space_unmap(msc->sc_iot, msc->sc_ioh, LE_NPORTS); } /* Index: src/sys/arch/mipsco/obio/if_le.c diff -u src/sys/arch/mipsco/obio/if_le.c:1.13 src/sys/arch/mipsco/obio/if_le.c:1.14 --- src/sys/arch/mipsco/obio/if_le.c:1.13 Tue Jan 19 22:06:21 2010 +++ src/sys/arch/mipsco/obio/if_le.c Sun May 29 10:45:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le.c,v 1.13 2010/01/19 22:06:21 pooka Exp $ */ +/* $NetBSD: if_le.c,v 1.14 2022/05/29 10:45:05 rin Exp $ */ /*- * Copyright (c) 1996, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.13 2010/01/19 22:06:21 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.14 2022/05/29 10:45:05 rin Exp $"); #include "opt_inet.h" @@ -177,25 +177,24 @@ le_attach(device_t parent, device_t self if (bus_dmamem_alloc(dmat, LE_MEMSIZE, 0, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) { aprint_error(": can't allocate DMA area\n"); - return; + goto bad_bsunmap; } /* Map pages into kernel memory */ if (bus_dmamem_map(dmat, &seg, rseg, LE_MEMSIZE, &kvaddr, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { aprint_error(": can't map DMA area\n"); - bus_dmamem_free(dmat, &seg, rseg); - return; + goto bad_free; } /* Build DMA map so we can get physical address */ if (bus_dmamap_create(dmat, LE_MEMSIZE, 1, LE_MEMSIZE, 0, BUS_DMA_NOWAIT, &lesc->sc_dmamap)) { aprint_error(": can't create DMA map\n"); - goto bad; + goto bad_unmap; } if (bus_dmamap_load(dmat, lesc->sc_dmamap, kvaddr, LE_MEMSIZE, NULL, BUS_DMA_NOWAIT)) { aprint_error(": can't load DMA map\n"); - goto bad; + goto bad_destroy; } sc->sc_memsize = LE_MEMSIZE; /* 16K Buffer space*/ @@ -226,9 +225,14 @@ le_attach(device_t parent, device_t self am7990_config(&lesc->sc_am7990); return; -bad: + bad_destroy: + bus_dmamap_destroy(dmat, lesc->sc_dmamap); + bad_unmap: bus_dmamem_unmap(dmat, kvaddr, LE_MEMSIZE); + bad_free: bus_dmamem_free(dmat, &seg, rseg); + bad_bsunmap: + bus_space_unmap(ca->ca_bustag, lesc->sc_reg, 8); } int Index: src/sys/arch/mvme68k/dev/if_le.c diff -u src/sys/arch/mvme68k/dev/if_le.c:1.36 src/sys/arch/mvme68k/dev/if_le.c:1.37 --- src/sys/arch/mvme68k/dev/if_le.c:1.36 Tue Jan 19 22:06:21 2010 +++ src/sys/arch/mvme68k/dev/if_le.c Sun May 29 10:45:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le.c,v 1.36 2010/01/19 22:06:21 pooka Exp $ */ +/* $NetBSD: if_le.c,v 1.37 2022/05/29 10:45:05 rin Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.36 2010/01/19 22:06:21 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le.c,v 1.37 2022/05/29 10:45:05 rin Exp $"); #include "opt_inet.h" @@ -179,13 +179,12 @@ le_pcc_attach(device_t parent, device_t &seg, 1, &rseg, BUS_DMA_NOWAIT | BUS_DMA_ONBOARD_RAM | BUS_DMA_24BIT)) { aprint_error(": Failed to allocate ether buffer\n"); - return; + goto bad_unmap; } if (bus_dmamem_map(pa->pa_dmat, &seg, rseg, ether_data_buff_size, (void **)&sc->sc_mem, BUS_DMA_NOWAIT | BUS_DMA_COHERENT)) { aprint_error(": Failed to map ether buffer\n"); - bus_dmamem_free(pa->pa_dmat, &seg, rseg); - return; + goto bad_free; } sc->sc_addr = seg.ds_addr; sc->sc_memsize = ether_data_buff_size; @@ -212,4 +211,11 @@ le_pcc_attach(device_t parent, device_t pcc_reg_write(sys_pcc, PCCREG_LANCE_INTR_CTRL, pa->pa_ipl | PCC_IENABLE); + + return; + + bad_free: + bus_dmamem_free(pa->pa_dmat, &seg, rseg); + bad_unmap: + bus_space_unmap(pa->pa_bust, lsc->sc_bush, 4); } Index: src/sys/arch/sparc/dev/if_le_obio.c diff -u src/sys/arch/sparc/dev/if_le_obio.c:1.28 src/sys/arch/sparc/dev/if_le_obio.c:1.29 --- src/sys/arch/sparc/dev/if_le_obio.c:1.28 Thu Apr 25 10:08:45 2019 +++ src/sys/arch/sparc/dev/if_le_obio.c Sun May 29 10:45:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le_obio.c,v 1.28 2019/04/25 10:08:45 msaitoh Exp $ */ +/* $NetBSD: if_le_obio.c,v 1.29 2022/05/29 10:45:05 rin Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le_obio.c,v 1.28 2019/04/25 10:08:45 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le_obio.c,v 1.29 2022/05/29 10:45:05 rin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -151,29 +151,26 @@ leattach_obio(device_t parent, device_t if ((error = bus_dmamap_create(dmatag, MEMSIZE, 1, MEMSIZE, 0, BUS_DMA_NOWAIT|BUS_DMA_24BIT, &lesc->sc_dmamap)) != 0) { aprint_error(": DMA map create error %d\n", error); - return; + goto bad_bsunmap; } /* Allocate DMA buffer */ if ((error = bus_dmamem_alloc(dmatag, MEMSIZE, PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT | BUS_DMA_24BIT)) != 0) { aprint_error(": DMA memory allocation error %d\n", error); - return; + goto bad_destroy; } /* Map DMA buffer into kernel space */ if ((error = bus_dmamem_map(dmatag, &seg, rseg, MEMSIZE, (void **)&sc->sc_mem, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) { aprint_error(": DMA memory map error %d\n", error); - bus_dmamem_free(lesc->sc_dmatag, &seg, rseg); - return; + goto bad_free; } /* Load DMA buffer */ if ((error = bus_dmamap_load(dmatag, lesc->sc_dmamap, sc->sc_mem, MEMSIZE, NULL, BUS_DMA_NOWAIT)) != 0) { aprint_error(": DMA buffer map load error %d\n", error); - bus_dmamem_unmap(dmatag, (void *)sc->sc_mem, MEMSIZE); - bus_dmamem_free(dmatag, &seg, rseg); - return; + goto bad_unmap; } sc->sc_addr = lesc->sc_dmamap->dm_segs[0].ds_addr & 0xffffff; @@ -200,4 +197,15 @@ leattach_obio(device_t parent, device_t /* Install interrupt */ (void)bus_intr_establish(lesc->sc_bustag, oba->oba_pri, IPL_NET, am7990_intr, sc); + + return; + + bad_unmap: + bus_dmamem_unmap(dmatag, (void *)sc->sc_mem, MEMSIZE); + bad_free: + bus_dmamem_free(lesc->sc_dmatag, &seg, rseg); + bad_destroy: + bus_dmamap_destroy(dmatag, lesc->sc_dmamap); + bad_bsunmap: + bus_space_unmap(oba->oba_bustag, lesc->sc_reg, 2 * sizeof(uint16_t)); } Index: src/sys/arch/vax/if/if_le_vsbus.c diff -u src/sys/arch/vax/if/if_le_vsbus.c:1.28 src/sys/arch/vax/if/if_le_vsbus.c:1.29 --- src/sys/arch/vax/if/if_le_vsbus.c:1.28 Tue Dec 14 23:38:30 2010 +++ src/sys/arch/vax/if/if_le_vsbus.c Sun May 29 10:45:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: if_le_vsbus.c,v 1.28 2010/12/14 23:38:30 matt Exp $ */ +/* $NetBSD: if_le_vsbus.c,v 1.29 2022/05/29 10:45:05 rin Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_le_vsbus.c,v 1.28 2010/12/14 23:38:30 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_le_vsbus.c,v 1.29 2022/05/29 10:45:05 rin Exp $"); #include "opt_inet.h" @@ -229,23 +229,19 @@ le_vsbus_attach(device_t parent, device_ BUS_DMA_NOWAIT|BUS_DMA_COHERENT); if (err) { aprint_error(": unable to map buffer block: err %d\n", err); - bus_dmamem_free(va->va_dmat, &seg, rseg); - return; + goto bad_free; } bus_dmamap_create(va->va_dmat, ALLOCSIZ, rseg, ALLOCSIZ, 0, BUS_DMA_NOWAIT, &sc->sc_dm); if (err) { aprint_error(": unable to create DMA map: err %d\n", err); - bus_dmamem_free(va->va_dmat, &seg, rseg); - return; + goto bad_unmap; } err = bus_dmamap_load(va->va_dmat, sc->sc_dm, sc->sc_am7990.lsc.sc_mem, ALLOCSIZ, NULL, BUS_DMA_NOWAIT); if (err) { aprint_error(": unable to load DMA map: err %d\n", err); - bus_dmamap_destroy(va->va_dmat, sc->sc_dm); - bus_dmamem_free(va->va_dmat, &seg, rseg); - return; + goto bad_destroy; } aprint_normal(" buf 0x%lx-0x%lx", sc->sc_dm->dm_segs->ds_addr, sc->sc_dm->dm_segs->ds_addr + sc->sc_dm->dm_segs->ds_len - 1); @@ -276,4 +272,13 @@ le_vsbus_attach(device_t parent, device_ aprint_normal("\n%s", device_xname(self)); am7990_config(&sc->sc_am7990); + + return; + + bad_destroy: + bus_dmamap_destroy(va->va_dmat, sc->sc_dm); + bad_unmap: + bus_dmamem_unmap(va->va_dmat, sc->sc_am7990.lsc.sc_mem, ALLOCSIZ); + bad_free: + bus_dmamem_free(va->va_dmat, &seg, rseg); }