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);
 }

Reply via email to