Module Name: src Committed By: snj Date: Sun Dec 10 10:10:25 UTC 2017
Modified Files: src/sys/arch/amiga/dev [netbsd-8]: if_bah_zbus.c src/sys/arch/arm/broadcom [netbsd-8]: bcm53xx_eth.c src/sys/arch/powerpc/booke/dev [netbsd-8]: pq3etsec.c src/sys/arch/usermode/dev [netbsd-8]: if_veth.c src/sys/dev/ic [netbsd-8]: an.c athn.c atw.c bwi.c dwc_gmac.c malo.c rt2560.c rt2661.c rt2860.c rtw.c rtwvar.h smc90cx6.c smc90cx6var.h wi.c src/sys/dev/pci [netbsd-8]: if_ipw.c if_iwi.c if_iwm.c if_iwn.c if_rtwn.c if_wm.c if_wpi.c src/sys/dev/pci/ixgbe [netbsd-8]: ixgbe.c ixv.c src/sys/dev/pcmcia [netbsd-8]: if_malo_pcmcia.c src/sys/dev/scsipi [netbsd-8]: if_se.c src/sys/dev/usb [netbsd-8]: if_upl.c src/sys/net [netbsd-8]: if.c if.h if_arc.h if_arcsubr.c if_bridge.c if_etherip.c if_faith.c if_gif.c if_loop.c if_mpls.c if_pppoe.c if_srt.c if_stf.c if_tap.c if_vlan.c src/sys/netinet [netbsd-8]: ip_carp.c src/sys/rump/net/lib/libshmif [netbsd-8]: if_shmem.c src/sys/rump/net/lib/libvirtif [netbsd-8]: if_virt.c Log Message: Pull up following revision(s) (requested by msaitoh in ticket #427): sys/arch/amiga/dev/if_bah_zbus.c: 1.17 sys/arch/arm/broadcom/bcm53xx_eth.c: 1.30 sys/arch/powerpc/booke/dev/pq3etsec.c: 1.32 sys/arch/usermode/dev/if_veth.c: 1.9 sys/dev/ic/an.c: 1.66 sys/dev/ic/athn.c: 1.17 sys/dev/ic/atw.c: 1.162 sys/dev/ic/bwi.c: 1.33 sys/dev/ic/dwc_gmac.c: 1.41-1.42 sys/dev/ic/malo.c: 1.10 sys/dev/ic/rt2560.c: 1.31 sys/dev/ic/rt2661.c: 1.36 sys/dev/ic/rt2860.c: 1.29 sys/dev/ic/rtw.c: 1.127 sys/dev/ic/rtwvar.h: 1.46 sys/dev/ic/smc90cx6.c: 1.71 sys/dev/ic/smc90cx6var.h: 1.12 sys/dev/ic/wi.c: 1.244 sys/dev/pci/if_ipw.c: 1.66 sys/dev/pci/if_iwi.c: 1.104 sys/dev/pci/if_iwm.c: 1.76 sys/dev/pci/if_iwn.c: 1.86 sys/dev/pci/if_rtwn.c: 1.13 sys/dev/pci/if_wm.c: 1.541 sys/dev/pci/if_wpi.c: 1.79 sys/dev/pci/ixgbe/ixgbe.c: 1.106 sys/dev/pci/ixgbe/ixv.c: 1.73 via patch sys/dev/pcmcia/if_malo_pcmcia.c: 1.15 sys/dev/scsipi/if_se.c: 1.95 sys/dev/usb/if_upl.c: 1.60 sys/net/if.c: 1.396 sys/net/if.h: 1.241 sys/net/if_arc.h: 1.23 sys/net/if_arcsubr.c: 1.78 sys/net/if_bridge.c: 1.136-1.137 sys/net/if_etherip.c: 1.39 sys/net/if_faith.c: 1.56 sys/net/if_gif.c: 1.131 sys/net/if_loop.c: 1.96 sys/net/if_mpls.c: 1.30 sys/net/if_pppoe.c: 1.129 sys/net/if_srt.c: 1.27 sys/net/if_stf.c: 1.102 sys/net/if_tap.c: 1.100 sys/net/if_vlan.c: 1.105 sys/netinet/ip_carp.c: 1.91 sys/rump/net/lib/libshmif/if_shmem.c: 1.73-1.74 sys/rump/net/lib/libvirtif/if_virt.c: 1.55-1.56 if_initalize() and if_attach() failed when resource allocation failed (e.g. allocating softint). Without this change, it panics. It's bad because resource shortage really occured when a lot of pseudo interface is created. To avoid this problem, don't panic and change return value of if_initialize() and if_attach() to int. Caller fanction will be recover from error cleanly by checking the return value. Return if bah_attach_subr() failed. If if_attach() failed in the attach function, return. - If if_initialize() failed in the attach function, free resources and return. - Add some missing frees in bridge_clone_destroy(). - KNF If error occured in bcmeth_ccb_attach(), free resources and return. If error occured in pq3etsec_attach(), free resources and return. If error occured in the attach function, free resources and return. - If if_initialize() failed in athn_attach(), free resources and return. - Add missing pmf_event_deregister() in athn_detach(). - Free resources correctly on some errors in atw_attach(). - Use apint*() insread of printf() in the attach function. If if_initialize() failed in the attach function, return. - If if_initialize() failed in the attach function, free resources and return. - Add missing dwc_gmac_free_dma_rings() and mutex_destroy() when attach failed. - If if_initialize() failed in the attach function, free resources and return. - ifp is always not NULL in iwi_detach(). Check correctly with ifp->if_softc. - If if_initialize() failed in the attach function, free resources and return. - Fix error path in the attach function correctly. If if_initialize() failed in the attach function, free resources and return. If if_attach() failed in the attach function, free resources and return. - If if_initialize() failed in the attach function, free resources and return. - KNF - If if_attach() failed in the attach function, free resources and return. - KNF Fix compile error. Fix compile error. We don't need '&mii', but just 'mii' for mii_detach(). Don't free sc_rthash twice To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.16.10.1 src/sys/arch/amiga/dev/if_bah_zbus.c cvs rdiff -u -r1.29 -r1.29.8.1 src/sys/arch/arm/broadcom/bcm53xx_eth.c cvs rdiff -u -r1.29.8.1 -r1.29.8.2 src/sys/arch/powerpc/booke/dev/pq3etsec.c cvs rdiff -u -r1.8 -r1.8.8.1 src/sys/arch/usermode/dev/if_veth.c cvs rdiff -u -r1.65 -r1.65.2.1 src/sys/dev/ic/an.c cvs rdiff -u -r1.16 -r1.16.4.1 src/sys/dev/ic/athn.c cvs rdiff -u -r1.161 -r1.161.6.1 src/sys/dev/ic/atw.c cvs rdiff -u -r1.31.6.1 -r1.31.6.2 src/sys/dev/ic/bwi.c cvs rdiff -u -r1.40 -r1.40.6.1 src/sys/dev/ic/dwc_gmac.c cvs rdiff -u -r1.9 -r1.9.6.1 src/sys/dev/ic/malo.c cvs rdiff -u -r1.30 -r1.30.2.1 src/sys/dev/ic/rt2560.c cvs rdiff -u -r1.35 -r1.35.2.1 src/sys/dev/ic/rt2661.c cvs rdiff -u -r1.26.2.2 -r1.26.2.3 src/sys/dev/ic/rt2860.c cvs rdiff -u -r1.126 -r1.126.2.1 src/sys/dev/ic/rtw.c cvs rdiff -u -r1.45 -r1.45.6.1 src/sys/dev/ic/rtwvar.h cvs rdiff -u -r1.70 -r1.70.2.1 src/sys/dev/ic/smc90cx6.c cvs rdiff -u -r1.11 -r1.11.30.1 src/sys/dev/ic/smc90cx6var.h cvs rdiff -u -r1.243 -r1.243.6.1 src/sys/dev/ic/wi.c cvs rdiff -u -r1.64.2.1 -r1.64.2.2 src/sys/dev/pci/if_ipw.c cvs rdiff -u -r1.103 -r1.103.2.1 src/sys/dev/pci/if_iwi.c cvs rdiff -u -r1.73.2.1 -r1.73.2.2 src/sys/dev/pci/if_iwm.c cvs rdiff -u -r1.84.6.1 -r1.84.6.2 src/sys/dev/pci/if_iwn.c cvs rdiff -u -r1.12 -r1.12.2.1 src/sys/dev/pci/if_rtwn.c cvs rdiff -u -r1.508.4.8 -r1.508.4.9 src/sys/dev/pci/if_wm.c cvs rdiff -u -r1.78 -r1.78.2.1 src/sys/dev/pci/if_wpi.c cvs rdiff -u -r1.88.2.4 -r1.88.2.5 src/sys/dev/pci/ixgbe/ixgbe.c cvs rdiff -u -r1.56.2.1 -r1.56.2.2 src/sys/dev/pci/ixgbe/ixv.c cvs rdiff -u -r1.13.6.1 -r1.13.6.2 src/sys/dev/pcmcia/if_malo_pcmcia.c cvs rdiff -u -r1.94 -r1.94.8.1 src/sys/dev/scsipi/if_se.c cvs rdiff -u -r1.59 -r1.59.8.1 src/sys/dev/usb/if_upl.c cvs rdiff -u -r1.394.2.2 -r1.394.2.3 src/sys/net/if.c cvs rdiff -u -r1.239.2.1 -r1.239.2.2 src/sys/net/if.h cvs rdiff -u -r1.22 -r1.22.90.1 src/sys/net/if_arc.h cvs rdiff -u -r1.77 -r1.77.6.1 src/sys/net/if_arcsubr.c cvs rdiff -u -r1.134.6.3 -r1.134.6.4 src/sys/net/if_bridge.c cvs rdiff -u -r1.38 -r1.38.10.1 src/sys/net/if_etherip.c cvs rdiff -u -r1.55 -r1.55.8.1 src/sys/net/if_faith.c cvs rdiff -u -r1.126.2.3 -r1.126.2.4 src/sys/net/if_gif.c cvs rdiff -u -r1.94.6.2 -r1.94.6.3 src/sys/net/if_loop.c cvs rdiff -u -r1.29 -r1.29.8.1 src/sys/net/if_mpls.c cvs rdiff -u -r1.125.6.3 -r1.125.6.4 src/sys/net/if_pppoe.c cvs rdiff -u -r1.26 -r1.26.6.1 src/sys/net/if_srt.c cvs rdiff -u -r1.101.8.1 -r1.101.8.2 src/sys/net/if_stf.c cvs rdiff -u -r1.99.6.1 -r1.99.6.2 src/sys/net/if_tap.c cvs rdiff -u -r1.97.2.9 -r1.97.2.10 src/sys/net/if_vlan.c cvs rdiff -u -r1.90.2.1 -r1.90.2.2 src/sys/netinet/ip_carp.c cvs rdiff -u -r1.72 -r1.72.8.1 src/sys/rump/net/lib/libshmif/if_shmem.c cvs rdiff -u -r1.54 -r1.54.8.1 src/sys/rump/net/lib/libvirtif/if_virt.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/amiga/dev/if_bah_zbus.c diff -u src/sys/arch/amiga/dev/if_bah_zbus.c:1.16 src/sys/arch/amiga/dev/if_bah_zbus.c:1.16.10.1 --- src/sys/arch/amiga/dev/if_bah_zbus.c:1.16 Fri Oct 30 12:19:08 2015 +++ src/sys/arch/amiga/dev/if_bah_zbus.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bah_zbus.c,v 1.16 2015/10/30 12:19:08 phx Exp $ */ +/* $NetBSD: if_bah_zbus.c,v 1.16.10.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bah_zbus.c,v 1.16 2015/10/30 12:19:08 phx Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bah_zbus.c,v 1.16.10.1 2017/12/10 10:10:23 snj Exp $"); /* * Driver frontend for the Commodore Busines Machines and the @@ -98,6 +98,7 @@ bah_zbus_attach(device_t parent, device_ struct bah_zbus_softc *bsc = device_private(self); struct bah_softc *sc = &bsc->sc_bah; struct zbus_args *zap = aux; + int rv; sc->sc_dev = self; #if (defined(BAH_DEBUG) && (BAH_DEBUG > 2)) @@ -115,7 +116,11 @@ bah_zbus_attach(device_t parent, device_ sc->sc_reset = bah_zbus_reset; - bah_attach_subr(sc); + rv = bah_attach_subr(sc); + if (rv != 0) { + aprint_error_dev(self, "bah_attach_subr failed(%d)\n", rv); + return; + } bsc->sc_isr.isr_intr = bahintr; bsc->sc_isr.isr_arg = sc; Index: src/sys/arch/arm/broadcom/bcm53xx_eth.c diff -u src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29.8.1 --- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.29 Thu Dec 15 09:28:02 2016 +++ src/sys/arch/arm/broadcom/bcm53xx_eth.c Sun Dec 10 10:10:23 2017 @@ -35,7 +35,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.29 2016/12/15 09:28:02 ozaki-r Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.29.8.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -321,45 +321,52 @@ bcmeth_ccb_attach(device_t parent, devic error = bcmeth_rxq_attach(sc, &sc->sc_rxq, 0); if (error) { aprint_error(": failed to init rxq: %d\n", error); - return; + goto fail_1; } error = bcmeth_txq_attach(sc, &sc->sc_txq, 0); if (error) { aprint_error(": failed to init txq: %d\n", error); - return; + goto fail_1; } error = bcmeth_mapcache_create(sc, &sc->sc_rx_mapcache, BCMETH_MAXRXMBUFS, MCLBYTES, BCMETH_NRXSEGS); if (error) { aprint_error(": failed to allocate rx dmamaps: %d\n", error); - return; + goto fail_1; } error = bcmeth_mapcache_create(sc, &sc->sc_tx_mapcache, BCMETH_MAXTXMBUFS, MCLBYTES, BCMETH_NTXSEGS); if (error) { aprint_error(": failed to allocate tx dmamaps: %d\n", error); - return; + goto fail_1; } error = workqueue_create(&sc->sc_workq, xname, bcmeth_worker, sc, (PRI_USER + MAXPRI_USER) / 2, IPL_NET, WQ_MPSAFE|WQ_PERCPU); if (error) { aprint_error(": failed to create workqueue: %d\n", error); - return; + goto fail_2; } sc->sc_soft_ih = softint_establish(SOFTINT_MPSAFE | SOFTINT_NET, bcmeth_soft_intr, sc); + if (sc->sc_ih == NULL) { + aprint_error_dev(self, "failed to establish interrupt %d\n", + loc->loc_intrs[0]); + goto fail_3; + } + sc->sc_ih = intr_establish(loc->loc_intrs[0], IPL_VM, IST_LEVEL, bcmeth_intr, sc); if (sc->sc_ih == NULL) { aprint_error_dev(self, "failed to establish interrupt %d\n", loc->loc_intrs[0]); + goto fail_4; } else { aprint_normal_dev(self, "interrupting on irq %d\n", loc->loc_intrs[0]); @@ -401,7 +408,12 @@ bcmeth_ccb_attach(device_t parent, devic /* * Attach the interface. */ - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail_5; + } ether_ifattach(ifp, sc->sc_enaddr); if_register(ifp); @@ -419,6 +431,20 @@ bcmeth_ccb_attach(device_t parent, devic evcnt_attach_dynamic(&sc->sc_ev_rx_badmagic_hi, EVCNT_TYPE_MISC, NULL, xname, "rx badmagic hi"); #endif + + return; + +fail_5: + ifmedia_removeall(&sc->sc_media); +fail_4: + intr_disestablish(sc->sc_ih); +fail_3: + softint_disestablish(sc->sc_soft_ih); +fail_2: + workqueue_destroy(sc->sc_workq); +fail_1: + mutex_obj_free(sc->sc_lock); + mutex_obj_free(sc->sc_hwlock); } static int Index: src/sys/arch/powerpc/booke/dev/pq3etsec.c diff -u src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.29.8.1 src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.29.8.2 --- src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.29.8.1 Tue Oct 24 08:38:58 2017 +++ src/sys/arch/powerpc/booke/dev/pq3etsec.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pq3etsec.c,v 1.29.8.1 2017/10/24 08:38:58 snj Exp $ */ +/* $NetBSD: pq3etsec.c,v 1.29.8.2 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -41,7 +41,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.29.8.1 2017/10/24 08:38:58 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.29.8.2 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -648,27 +648,27 @@ pq3etsec_attach(device_t parent, device_ error = pq3etsec_rxq_attach(sc, &sc->sc_rxq, 0); if (error) { aprint_error(": failed to init rxq: %d\n", error); - return; + goto fail_1; } error = pq3etsec_txq_attach(sc, &sc->sc_txq, 0); if (error) { aprint_error(": failed to init txq: %d\n", error); - return; + goto fail_2; } error = pq3etsec_mapcache_create(sc, &sc->sc_rx_mapcache, ETSEC_MAXRXMBUFS, MCLBYTES, ETSEC_NRXSEGS); if (error) { aprint_error(": failed to allocate rx dmamaps: %d\n", error); - return; + goto fail_3; } error = pq3etsec_mapcache_create(sc, &sc->sc_tx_mapcache, ETSEC_MAXTXMBUFS, MCLBYTES, ETSEC_NTXSEGS); if (error) { aprint_error(": failed to allocate tx dmamaps: %d\n", error); - return; + goto fail_4; } sc->sc_tx_ih = intr_establish(cnl->cnl_intrs[0], IPL_VM, IST_ONCHIP, @@ -676,7 +676,7 @@ pq3etsec_attach(device_t parent, device_ if (sc->sc_tx_ih == NULL) { aprint_error(": failed to establish tx interrupt: %d\n", cnl->cnl_intrs[0]); - return; + goto fail_5; } sc->sc_rx_ih = intr_establish(cnl->cnl_intrs[1], IPL_VM, IST_ONCHIP, @@ -684,7 +684,7 @@ pq3etsec_attach(device_t parent, device_ if (sc->sc_rx_ih == NULL) { aprint_error(": failed to establish rx interrupt: %d\n", cnl->cnl_intrs[1]); - return; + goto fail_6; } sc->sc_error_ih = intr_establish(cnl->cnl_intrs[2], IPL_VM, IST_ONCHIP, @@ -692,7 +692,7 @@ pq3etsec_attach(device_t parent, device_ if (sc->sc_error_ih == NULL) { aprint_error(": failed to establish error interrupt: %d\n", cnl->cnl_intrs[2]); - return; + goto fail_7; } int softint_flags = SOFTINT_NET; @@ -703,7 +703,7 @@ pq3etsec_attach(device_t parent, device_ pq3etsec_soft_intr, sc); if (sc->sc_soft_ih == NULL) { aprint_error(": failed to establish soft interrupt\n"); - return; + goto fail_8; } /* @@ -719,7 +719,7 @@ pq3etsec_attach(device_t parent, device_ sc->sc_mdio_dev = device_find_by_driver_unit("mdio", mdio); if (sc->sc_mdio_dev == NULL) { aprint_error(": failed to locate mdio device\n"); - return; + goto fail_9; } aprint_normal("\n"); } @@ -734,7 +734,6 @@ pq3etsec_attach(device_t parent, device_ sc->sc_ic_tx_count = 16; pq3etsec_set_ic_rx(sc); pq3etsec_set_ic_tx(sc); - pq3etsec_sysctl_setup(NULL, sc); char enaddr[ETHER_ADDR_LEN] = { [0] = sc->sc_macstnaddr2 >> 16, @@ -794,7 +793,13 @@ pq3etsec_attach(device_t parent, device_ /* * Attach the interface. */ - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail_10; + } + pq3etsec_sysctl_setup(NULL, sc); ether_ifattach(ifp, enaddr); if_register(ifp); @@ -818,6 +823,36 @@ pq3etsec_attach(device_t parent, device_ NULL, xname, "rx pause"); evcnt_attach_dynamic(&sc->sc_ev_mii_ticks, EVCNT_TYPE_MISC, NULL, xname, "mii ticks"); + return; + +fail_10: + ifmedia_removeall(&sc->sc_mii.mii_media); + mii_detach(&sc->sc_mii, sc->sc_phy_addr, MII_OFFSET_ANY); +fail_9: + softint_disestablish(sc->sc_soft_ih); +fail_8: + intr_disestablish(sc->sc_error_ih); +fail_7: + intr_disestablish(sc->sc_rx_ih); +fail_6: + intr_disestablish(sc->sc_tx_ih); +fail_5: + pq3etsec_mapcache_destroy(sc, sc->sc_tx_mapcache); +fail_4: + pq3etsec_mapcache_destroy(sc, sc->sc_rx_mapcache); +fail_3: +#if 0 /* notyet */ + pq3etsec_txq_detach(sc); +#endif +fail_2: +#if 0 /* notyet */ + pq3etsec_rxq_detach(sc); +#endif +fail_1: + callout_destroy(&sc->sc_mii_callout); + mutex_obj_free(sc->sc_lock); + mutex_obj_free(sc->sc_hwlock); + bus_space_unmap(sc->sc_bst, sc->sc_bsh, cnl->cnl_size); } static uint64_t Index: src/sys/arch/usermode/dev/if_veth.c diff -u src/sys/arch/usermode/dev/if_veth.c:1.8 src/sys/arch/usermode/dev/if_veth.c:1.8.8.1 --- src/sys/arch/usermode/dev/if_veth.c:1.8 Thu Dec 15 09:28:04 2016 +++ src/sys/arch/usermode/dev/if_veth.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_veth.c,v 1.8 2016/12/15 09:28:04 ozaki-r Exp $ */ +/* $NetBSD: if_veth.c,v 1.8.8.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_veth.c,v 1.8 2016/12/15 09:28:04 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_veth.c,v 1.8.8.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -102,6 +102,7 @@ veth_attach(device_t parent, device_t se struct veth_softc *sc = device_private(self); struct thunkbus_attach_args *taa = opaque; struct ifnet *ifp = &sc->sc_ec.ec_if; + int rv; sc->sc_dev = self; @@ -137,7 +138,13 @@ veth_attach(device_t parent, device_t se IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); IFQ_SET_READY(&ifq->if_snd); - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(self, "if_initialize failed(%d)\n", rv); + thunk_close(sc->sc_tapfd); + pmf_device_deregister(self); + return; /* Error */ + } ether_ifattach(ifp, sc->sc_eaddr); if_register(ifp); Index: src/sys/dev/ic/an.c diff -u src/sys/dev/ic/an.c:1.65 src/sys/dev/ic/an.c:1.65.2.1 --- src/sys/dev/ic/an.c:1.65 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/an.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: an.c,v 1.65 2017/05/23 02:19:14 ozaki-r Exp $ */ +/* $NetBSD: an.c,v 1.65.2.1 2017/12/10 10:10:23 snj Exp $ */ /* * Copyright (c) 1997, 1998, 1999 * Bill Paul <wp...@ctr.columbia.edu>. All rights reserved. @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: an.c,v 1.65 2017/05/23 02:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: an.c,v 1.65.2.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> @@ -166,7 +166,7 @@ an_attach(struct an_softc *sc) { struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &sc->sc_if; - int i, s; + int i, s, rv = 0; struct an_rid_wepkey *akey; int buflen, kid, rid; int chan, chan_min, chan_max; @@ -176,38 +176,38 @@ an_attach(struct an_softc *sc) an_wait(sc); if (an_reset(sc) != 0) { config_deactivate(sc->sc_dev); - splx(s); - return 1; + rv = 1; + goto fail_1; } sc->sc_soft_ih = softint_establish(SOFTINT_NET, an_softintr, sc); if (sc->sc_soft_ih == NULL) { - splx(s); aprint_error_dev(sc->sc_dev, "failed to establish softint\n"); - return 1; + rv = 1; + goto fail_1; } /* Load factory config */ if (an_cmd(sc, AN_CMD_READCFG, 0) != 0) { - splx(s); aprint_error_dev(sc->sc_dev, "failed to load config data\n"); - return 1; + rv = 1; + goto fail_2; } /* Read the current configuration */ buflen = sizeof(sc->sc_config); if (an_read_rid(sc, AN_RID_GENCONFIG, &sc->sc_config, &buflen) != 0) { - splx(s); aprint_error_dev(sc->sc_dev, "read config failed\n"); - return 1; + rv = 1; + goto fail_2; } /* Read the card capabilities */ buflen = sizeof(sc->sc_caps); if (an_read_rid(sc, AN_RID_CAPABILITIES, &sc->sc_caps, &buflen) != 0) { - splx(s); aprint_error_dev(sc->sc_dev, "read caps failed\n"); - return 1; + rv = 1; + goto fail_2; } #ifdef AN_DEBUG @@ -317,7 +317,11 @@ an_attach(struct an_softc *sc) /* * Call MI attach routine. */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv); + goto fail_2; + } ieee80211_ifattach(ic); ifp->if_percpuq = if_percpuq_create(ifp); if_register(ifp); @@ -346,6 +350,14 @@ an_attach(struct an_softc *sc) ieee80211_announce(ic); return 0; + +fail_2: + if (sc->sc_soft_ih != NULL) + softint_disestablish(sc->sc_soft_ih); +fail_1: + splx(s); + + return rv; } #ifdef AN_DEBUG Index: src/sys/dev/ic/athn.c diff -u src/sys/dev/ic/athn.c:1.16 src/sys/dev/ic/athn.c:1.16.4.1 --- src/sys/dev/ic/athn.c:1.16 Tue Apr 11 17:27:54 2017 +++ src/sys/dev/ic/athn.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: athn.c,v 1.16 2017/04/11 17:27:54 jmcneill Exp $ */ +/* $NetBSD: athn.c,v 1.16.4.1 2017/12/10 10:10:23 snj Exp $ */ /* $OpenBSD: athn.c,v 1.83 2014/07/22 13:12:11 mpi Exp $ */ /*- @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.16 2017/04/11 17:27:54 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: athn.c,v 1.16.4.1 2017/12/10 10:10:23 snj Exp $"); #ifndef _MODULE #include "athn_usb.h" /* for NATHN_USB */ @@ -349,7 +349,16 @@ athn_attach(struct athn_softc *sc) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + pmf_event_deregister(sc->sc_dev, PMFE_RADIO_OFF, + athn_pmf_wlan_off, false); + callout_destroy(&sc->sc_scan_to); + callout_destroy(&sc->sc_calib_to); + return error; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -412,6 +421,9 @@ athn_detach(struct athn_softc *sc) callout_destroy(&sc->sc_scan_to); callout_destroy(&sc->sc_calib_to); + + pmf_event_deregister(sc->sc_dev, PMFE_RADIO_OFF, athn_pmf_wlan_off, + false); } /* Index: src/sys/dev/ic/atw.c diff -u src/sys/dev/ic/atw.c:1.161 src/sys/dev/ic/atw.c:1.161.6.1 --- src/sys/dev/ic/atw.c:1.161 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/ic/atw.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: atw.c,v 1.161 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: atw.c,v 1.161.6.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.161 2017/02/02 10:05:35 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.161.6.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> @@ -621,7 +621,7 @@ atw_attach(struct atw_softc *sc) atw_reset(sc); if (atw_read_srom(sc) == -1) - return; + goto fail_5; sc->sc_rftype = __SHIFTOUT(sc->sc_srom[ATW_SR_CSR20], ATW_SR_RFTYPE_MASK); @@ -631,14 +631,14 @@ atw_attach(struct atw_softc *sc) if (sc->sc_rftype >= __arraycount(type_strings)) { aprint_error_dev(sc->sc_dev, "unknown RF\n"); - return; + goto fail_5; } if (sc->sc_bbptype >= __arraycount(type_strings)) { aprint_error_dev(sc->sc_dev, "unknown BBP\n"); - return; + goto fail_5; } - printf("%s: %s RF, %s BBP", device_xname(sc->sc_dev), + aprint_normal_dev(sc->sc_dev, "%s RF, %s BBP", type_strings[sc->sc_rftype], type_strings[sc->sc_bbptype]); /* XXX There exists a Linux driver which seems to use RFType = 0 for @@ -674,8 +674,8 @@ atw_attach(struct atw_softc *sc) case ATW_BBPTYPE_MARVEL: break; case ATW_C_BBPTYPE_RFMD: - printf("%s: ADM8211C MAC/RFMD BBP not supported yet.\n", - device_xname(sc->sc_dev)); + aprint_error_dev(sc->sc_dev, + "ADM8211C MAC/RFMD BBP not supported yet.\n"); break; } @@ -757,11 +757,12 @@ atw_attach(struct atw_softc *sc) ic->ic_myaddr[5] = __SHIFTOUT(reg, ATW_PAR1_PAB5_MASK); if (IEEE80211_ADDR_EQ(ic->ic_myaddr, empty_macaddr)) { - printf(" could not get mac address, attach failed\n"); - return; + aprint_error_dev(sc->sc_dev, + "could not get mac address, attach failed\n"); + goto fail_5; } - printf(" 802.11 address %s\n", ether_sprintf(ic->ic_myaddr)); + aprint_normal(" 802.11 address %s\n", ether_sprintf(ic->ic_myaddr)); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); ifp->if_softc = sc; @@ -791,7 +792,12 @@ atw_attach(struct atw_softc *sc) * Call MI attach routines. */ - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail_5; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); Index: src/sys/dev/ic/bwi.c diff -u src/sys/dev/ic/bwi.c:1.31.6.1 src/sys/dev/ic/bwi.c:1.31.6.2 --- src/sys/dev/ic/bwi.c:1.31.6.1 Sat Aug 5 05:06:48 2017 +++ src/sys/dev/ic/bwi.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: bwi.c,v 1.31.6.1 2017/08/05 05:06:48 snj Exp $ */ +/* $NetBSD: bwi.c,v 1.31.6.2 2017/12/10 10:10:23 snj Exp $ */ /* $OpenBSD: bwi.c,v 1.74 2008/02/25 21:13:30 mglocker Exp $ */ /* @@ -48,7 +48,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bwi.c,v 1.31.6.1 2017/08/05 05:06:48 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bwi.c,v 1.31.6.2 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> #include <sys/callout.h> @@ -1021,7 +1021,12 @@ bwi_attach(struct bwi_softc *sc) ic->ic_updateslot = bwi_updateslot; - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail; + } ieee80211_ifattach(ic); ifp->if_percpuq = if_percpuq_create(ifp); if_register(ifp); Index: src/sys/dev/ic/dwc_gmac.c diff -u src/sys/dev/ic/dwc_gmac.c:1.40 src/sys/dev/ic/dwc_gmac.c:1.40.6.1 --- src/sys/dev/ic/dwc_gmac.c:1.40 Mon Feb 20 07:43:29 2017 +++ src/sys/dev/ic/dwc_gmac.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dwc_gmac.c,v 1.40 2017/02/20 07:43:29 ozaki-r Exp $ */ +/* $NetBSD: dwc_gmac.c,v 1.40.6.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 2013, 2014 The NetBSD Foundation, Inc. @@ -41,7 +41,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.40 2017/02/20 07:43:29 ozaki-r Exp $"); +__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.40.6.1 2017/12/10 10:10:23 snj Exp $"); /* #define DWC_GMAC_DEBUG 1 */ @@ -146,6 +146,7 @@ dwc_gmac_attach(struct dwc_gmac_softc *s struct mii_data * const mii = &sc->sc_mii; struct ifnet * const ifp = &sc->sc_ec.ec_if; prop_dictionary_t dict; + int rv; mutex_init(&sc->sc_mdio_lock, MUTEX_DEFAULT, IPL_NET); sc->sc_mii_clk = mii_clk & 7; @@ -259,7 +260,9 @@ dwc_gmac_attach(struct dwc_gmac_softc *s * Ready, attach interface */ /* Attach the interface. */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) + goto fail_2; sc->sc_ipq = if_percpuq_create(&sc->sc_ec.ec_if); if_deferred_start_init(ifp, NULL); ether_ifattach(ifp, enaddr); @@ -277,10 +280,17 @@ dwc_gmac_attach(struct dwc_gmac_softc *s mutex_exit(sc->sc_lock); return; - +fail_2: + ifmedia_removeall(&mii->mii_media); + mii_detach(mii, MII_PHY_ANY, MII_OFFSET_ANY); + mutex_destroy(&sc->sc_txq.t_mtx); + mutex_destroy(&sc->sc_rxq.r_mtx); + mutex_obj_free(sc->sc_lock); fail: dwc_gmac_free_rx_ring(sc, &sc->sc_rxq); dwc_gmac_free_tx_ring(sc, &sc->sc_txq); + dwc_gmac_free_dma_rings(sc); + mutex_destroy(&sc->sc_mdio_lock); } Index: src/sys/dev/ic/malo.c diff -u src/sys/dev/ic/malo.c:1.9 src/sys/dev/ic/malo.c:1.9.6.1 --- src/sys/dev/ic/malo.c:1.9 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/ic/malo.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: malo.c,v 1.9 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: malo.c,v 1.9.6.1 2017/12/10 10:10:23 snj Exp $ */ /* $OpenBSD: malo.c,v 1.92 2010/08/27 17:08:00 jsg Exp $ */ /* @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: malo.c,v 1.9 2017/02/02 10:05:35 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: malo.c,v 1.9.6.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -366,7 +366,7 @@ malo_attach(struct malo_softc *sc) { struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &sc->sc_if; - int i; + int i, rv; /* initialize channel scanning timer */ callout_init(&sc->sc_scan_to, 0); @@ -422,7 +422,16 @@ malo_attach(struct malo_softc *sc) aprint_normal(", address %s\n", ether_sprintf(ic->ic_myaddr)); /* attach interface */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv); + malo_free_tx_ring(sc, &sc->sc_txring); + malo_free_rx_ring(sc, &sc->sc_rxring); + malo_free_cmd(sc); + callout_destroy(&sc->sc_scan_to); + + return rv; /* Error */ + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); Index: src/sys/dev/ic/rt2560.c diff -u src/sys/dev/ic/rt2560.c:1.30 src/sys/dev/ic/rt2560.c:1.30.2.1 --- src/sys/dev/ic/rt2560.c:1.30 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/rt2560.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rt2560.c,v 1.30 2017/05/23 02:19:14 ozaki-r Exp $ */ +/* $NetBSD: rt2560.c,v 1.30.2.1 2017/12/10 10:10:23 snj Exp $ */ /* $OpenBSD: rt2560.c,v 1.15 2006/04/20 20:31:12 miod Exp $ */ /* $FreeBSD: rt2560.c,v 1.3 2006/03/21 21:15:43 damien Exp $*/ @@ -24,7 +24,7 @@ * http://www.ralinktech.com/ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rt2560.c,v 1.30 2017/05/23 02:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rt2560.c,v 1.30.2.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> @@ -453,7 +453,12 @@ rt2560_attach(void *xsc, int id) IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; } - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail6; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -492,6 +497,7 @@ rt2560_attach(void *xsc, int id) return 0; +fail6: rt2560_free_rx_ring(sc, &sc->rxq); fail5: rt2560_free_tx_ring(sc, &sc->bcnq); fail4: rt2560_free_tx_ring(sc, &sc->prioq); fail3: rt2560_free_tx_ring(sc, &sc->atimq); Index: src/sys/dev/ic/rt2661.c diff -u src/sys/dev/ic/rt2661.c:1.35 src/sys/dev/ic/rt2661.c:1.35.2.1 --- src/sys/dev/ic/rt2661.c:1.35 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/rt2661.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rt2661.c,v 1.35 2017/05/23 02:19:14 ozaki-r Exp $ */ +/* $NetBSD: rt2661.c,v 1.35.2.1 2017/12/10 10:10:23 snj Exp $ */ /* $OpenBSD: rt2661.c,v 1.17 2006/05/01 08:41:11 damien Exp $ */ /* $FreeBSD: rt2560.c,v 1.5 2006/06/02 19:59:31 csjp Exp $ */ @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.35 2017/05/23 02:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.35.2.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> @@ -342,7 +342,12 @@ rt2661_attach(void *xsc, int id) IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; } - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail7; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -380,6 +385,7 @@ rt2661_attach(void *xsc, int id) return 0; +fail7: rt2661_free_rx_ring(sc, &sc->rxq); fail6: rt2661_free_tx_ring(sc, &sc->mgtq); fail5: rt2661_free_tx_ring(sc, &sc->txq[3]); fail4: rt2661_free_tx_ring(sc, &sc->txq[2]); Index: src/sys/dev/ic/rt2860.c diff -u src/sys/dev/ic/rt2860.c:1.26.2.2 src/sys/dev/ic/rt2860.c:1.26.2.3 --- src/sys/dev/ic/rt2860.c:1.26.2.2 Tue Aug 1 23:10:00 2017 +++ src/sys/dev/ic/rt2860.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rt2860.c,v 1.26.2.2 2017/08/01 23:10:00 snj Exp $ */ +/* $NetBSD: rt2860.c,v 1.26.2.3 2017/12/10 10:10:23 snj Exp $ */ /* $OpenBSD: rt2860.c,v 1.90 2016/04/13 10:49:26 mpi Exp $ */ /* $FreeBSD: head/sys/dev/ral/rt2860.c 306591 2016-10-02 20:35:55Z avos $ */ @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.26.2.2 2017/08/01 23:10:00 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.26.2.3 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> #include <sys/sockio.h> @@ -401,7 +401,25 @@ rt2860_attachhook(device_t self) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + int qid; + + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + for (qid = 0; qid < MAXQS; qid++) + rt2860_free_tx_ring(sc, &sc->txq[qid]); + rt2860_free_rx_ring(sc, &sc->rxq); + rt2860_free_tx_pool(sc); + + if (sc->sc_soft_ih != NULL) { + softint_disestablish(sc->sc_soft_ih); + sc->sc_soft_ih = NULL; + } + if (sc->ucode != NULL) + firmware_free(sc->ucode, sc->ucsize); + return; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); Index: src/sys/dev/ic/rtw.c diff -u src/sys/dev/ic/rtw.c:1.126 src/sys/dev/ic/rtw.c:1.126.2.1 --- src/sys/dev/ic/rtw.c:1.126 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/rtw.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rtw.c,v 1.126 2017/05/23 02:19:14 ozaki-r Exp $ */ +/* $NetBSD: rtw.c,v 1.126.2.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 David Young. All rights * reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.126 2017/05/23 02:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.126.2.1 2017/12/10 10:10:23 snj Exp $"); #include <sys/param.h> @@ -4225,11 +4225,16 @@ rtw_attach(struct rtw_softc *sc) rtw_set80211props(&sc->sc_ic); rtw_led_attach(&sc->sc_led_state, (void *)sc); + NEXT_ATTACH_STATE(sc, FINISH_LED_ATTACH); /* * Call MI attach routines. */ - if_initialize(ifp); + rc = if_initialize(ifp); + if (rc != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rc); + goto err; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -4276,6 +4281,7 @@ rtw_detach(struct rtw_softc *sc) callout_stop(&sc->sc_scan_ch); ieee80211_ifdetach(&sc->sc_ic); if_detach(ifp); + case FINISH_LED_ATTACH: rtw_led_detach(&sc->sc_led_state); /*FALLTHROUGH*/ case FINISH_ID_STA: Index: src/sys/dev/ic/rtwvar.h diff -u src/sys/dev/ic/rtwvar.h:1.45 src/sys/dev/ic/rtwvar.h:1.45.6.1 --- src/sys/dev/ic/rtwvar.h:1.45 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/ic/rtwvar.h Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rtwvar.h,v 1.45 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: rtwvar.h,v 1.45.6.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 2004, 2005 David Young. All rights reserved. * @@ -313,8 +313,8 @@ struct rtw_tx_radiotap_header { enum rtw_attach_state {FINISHED, FINISH_DESCMAP_LOAD, FINISH_DESCMAP_CREATE, FINISH_DESC_MAP, FINISH_DESC_ALLOC, FINISH_RXMAPS_CREATE, FINISH_TXMAPS_CREATE, FINISH_RESET, FINISH_READ_SROM, FINISH_PARSE_SROM, - FINISH_RF_ATTACH, FINISH_ID_STA, FINISH_TXDESCBLK_SETUP, - FINISH_TXCTLBLK_SETUP, DETACHED}; + FINISH_RF_ATTACH, FINISH_ID_STA, FINISH_LED_ATTACH, + FINISH_TXDESCBLK_SETUP, FINISH_TXCTLBLK_SETUP, DETACHED}; struct rtw_mtbl { int (*mt_newstate)(struct ieee80211com *, Index: src/sys/dev/ic/smc90cx6.c diff -u src/sys/dev/ic/smc90cx6.c:1.70 src/sys/dev/ic/smc90cx6.c:1.70.2.1 --- src/sys/dev/ic/smc90cx6.c:1.70 Tue May 23 02:43:13 2017 +++ src/sys/dev/ic/smc90cx6.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: smc90cx6.c,v 1.70 2017/05/23 02:43:13 ozaki-r Exp $ */ +/* $NetBSD: smc90cx6.c,v 1.70.2.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: smc90cx6.c,v 1.70 2017/05/23 02:43:13 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: smc90cx6.c,v 1.70.2.1 2017/12/10 10:10:23 snj Exp $"); /* #define BAHSOFTCOPY */ #define BAHRETRANSMIT /**/ @@ -140,11 +140,11 @@ void bah_reconwatch(void *); #define GETMEM(off) bus_space_read_1(bst_m, mem, (off)) #define PUTMEM(off, v) bus_space_write_1(bst_m, mem, (off), (v)) -void +int bah_attach_subr(struct bah_softc *sc) { struct ifnet *ifp = &sc->sc_arccom.ac_if; - int s; + int s, rv; u_int8_t linkaddress; bus_space_tag_t bst_r = sc->sc_bst_r; @@ -197,7 +197,9 @@ bah_attach_subr(struct bah_softc *sc) ifp->if_mtu = ARCMTU; - arc_ifattach(ifp, linkaddress); + rv = arc_ifattach(ifp, linkaddress); + if (rv != 0) + return rv; if_deferred_start_init(ifp, NULL); #ifdef BAHSOFTCOPY @@ -207,6 +209,7 @@ bah_attach_subr(struct bah_softc *sc) #endif callout_init(&sc->sc_recon_ch, 0); + return 0; } /* Index: src/sys/dev/ic/smc90cx6var.h diff -u src/sys/dev/ic/smc90cx6var.h:1.11 src/sys/dev/ic/smc90cx6var.h:1.11.30.1 --- src/sys/dev/ic/smc90cx6var.h:1.11 Sat Oct 27 17:18:22 2012 +++ src/sys/dev/ic/smc90cx6var.h Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: smc90cx6var.h,v 1.11 2012/10/27 17:18:22 chs Exp $ */ +/* $NetBSD: smc90cx6var.h,v 1.11.30.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ struct bah_softc { u_char sc_retransmits[2]; /* unused at the moment */ }; -void bah_attach_subr(struct bah_softc *); +int bah_attach_subr(struct bah_softc *); int bahintr(void *); #endif Index: src/sys/dev/ic/wi.c diff -u src/sys/dev/ic/wi.c:1.243 src/sys/dev/ic/wi.c:1.243.6.1 --- src/sys/dev/ic/wi.c:1.243 Wed Mar 29 09:04:35 2017 +++ src/sys/dev/ic/wi.c Sun Dec 10 10:10:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: wi.c,v 1.243 2017/03/29 09:04:35 msaitoh Exp $ */ +/* $NetBSD: wi.c,v 1.243.6.1 2017/12/10 10:10:23 snj Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.243 2017/03/29 09:04:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.243.6.1 2017/12/10 10:10:23 snj Exp $"); #define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */ #define WI_HERMES_STATS_WAR /* Work around stats counter bug. */ @@ -373,7 +373,7 @@ wi_attach(struct wi_softc *sc, const u_i static const u_int8_t empty_macaddr[IEEE80211_ADDR_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - int s; + int s, rv; sc->sc_soft_ih = softint_establish(SOFTINT_NET, wi_softintr, sc); if (sc->sc_soft_ih == NULL) { @@ -550,7 +550,11 @@ wi_attach(struct wi_softc *sc, const u_i /* * Call MI attach routines. */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv); + goto fail_2; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -588,6 +592,9 @@ wi_attach(struct wi_softc *sc, const u_i ieee80211_announce(ic); return 0; +fail_2: + callout_destroy(&sc->sc_rssadapt_ch); + fail: splx(s); softint_disestablish(sc->sc_soft_ih); sc->sc_soft_ih = NULL; Index: src/sys/dev/pci/if_ipw.c diff -u src/sys/dev/pci/if_ipw.c:1.64.2.1 src/sys/dev/pci/if_ipw.c:1.64.2.2 --- src/sys/dev/pci/if_ipw.c:1.64.2.1 Sat Aug 5 04:35:21 2017 +++ src/sys/dev/pci/if_ipw.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ipw.c,v 1.64.2.1 2017/08/05 04:35:21 snj Exp $ */ +/* $NetBSD: if_ipw.c,v 1.64.2.2 2017/12/10 10:10:24 snj Exp $ */ /* FreeBSD: src/sys/dev/ipw/if_ipw.c,v 1.15 2005/11/13 17:17:40 damien Exp */ /*- @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.64.2.1 2017/08/05 04:35:21 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.64.2.2 2017/12/10 10:10:24 snj Exp $"); /*- * Intel(R) PRO/Wireless 2100 MiniPCI driver @@ -303,7 +303,13 @@ ipw_attach(device_t parent, device_t sel aprint_normal_dev(sc->sc_dev, "802.11 address %s\n", ether_sprintf(ic->ic_myaddr)); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + ifp->if_softc = NULL; /* For ipw_detach(). */ + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); Index: src/sys/dev/pci/if_iwi.c diff -u src/sys/dev/pci/if_iwi.c:1.103 src/sys/dev/pci/if_iwi.c:1.103.2.1 --- src/sys/dev/pci/if_iwi.c:1.103 Tue May 23 02:19:14 2017 +++ src/sys/dev/pci/if_iwi.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwi.c,v 1.103 2017/05/23 02:19:14 ozaki-r Exp $ */ +/* $NetBSD: if_iwi.c,v 1.103.2.1 2017/12/10 10:10:24 snj Exp $ */ /* $OpenBSD: if_iwi.c,v 1.111 2010/11/15 19:11:57 damien Exp $ */ /*- @@ -19,7 +19,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.103 2017/05/23 02:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.103.2.1 2017/12/10 10:10:24 snj Exp $"); /*- * Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver @@ -367,7 +367,13 @@ iwi_attach(device_t parent, device_t sel IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + ifp->if_softc = NULL; /* For iwi_detach() */ + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -454,16 +460,13 @@ iwi_detach(device_t self, int flags) struct iwi_softc *sc = device_private(self); struct ifnet *ifp = &sc->sc_if; - pmf_device_deregister(self); - - if (ifp != NULL) + if (ifp->if_softc != NULL) { + pmf_device_deregister(self); iwi_stop(ifp, 1); - - iwi_free_firmware(sc); - - ieee80211_ifdetach(&sc->sc_ic); - if (ifp != NULL) + iwi_free_firmware(sc); + ieee80211_ifdetach(&sc->sc_ic); if_detach(ifp); + } iwi_free_cmd_ring(sc, &sc->cmdq); iwi_free_tx_ring(sc, &sc->txq[0]); Index: src/sys/dev/pci/if_iwm.c diff -u src/sys/dev/pci/if_iwm.c:1.73.2.1 src/sys/dev/pci/if_iwm.c:1.73.2.2 --- src/sys/dev/pci/if_iwm.c:1.73.2.1 Sat Jun 10 06:17:01 2017 +++ src/sys/dev/pci/if_iwm.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwm.c,v 1.73.2.1 2017/06/10 06:17:01 snj Exp $ */ +/* $NetBSD: if_iwm.c,v 1.73.2.2 2017/12/10 10:10:24 snj Exp $ */ /* OpenBSD: if_iwm.c,v 1.148 2016/11/19 21:07:08 stsp Exp */ #define IEEE80211_NO_HT /* @@ -106,7 +106,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.73.2.1 2017/06/10 06:17:01 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.73.2.2 2017/12/10 10:10:24 snj Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -8037,7 +8037,7 @@ iwm_attach(device_t parent, device_t sel err = iwm_alloc_rx_ring(sc, &sc->rxq); if (err) { aprint_error_dev(sc->sc_dev, "could not allocate RX ring\n"); - goto fail4; + goto fail5; } /* Clear pending interrupts. */ @@ -8122,7 +8122,12 @@ iwm_attach(device_t parent, device_t sel IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ); - if_initialize(ifp); + err = if_initialize(ifp); + if (err != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + err); + goto fail6; + } #if 0 ieee80211_ifattach(ic); #else @@ -8168,10 +8173,10 @@ iwm_attach(device_t parent, device_t sel return; -fail4: while (--txq_i >= 0) +fail6: iwm_free_rx_ring(sc, &sc->rxq); +fail5: while (--txq_i >= 0) iwm_free_tx_ring(sc, &sc->txq[txq_i]); - iwm_free_rx_ring(sc, &sc->rxq); - iwm_dma_contig_free(&sc->sched_dma); +fail4: iwm_dma_contig_free(&sc->sched_dma); fail3: if (sc->ict_dma.vaddr != NULL) iwm_dma_contig_free(&sc->ict_dma); fail2: iwm_dma_contig_free(&sc->kw_dma); Index: src/sys/dev/pci/if_iwn.c diff -u src/sys/dev/pci/if_iwn.c:1.84.6.1 src/sys/dev/pci/if_iwn.c:1.84.6.2 --- src/sys/dev/pci/if_iwn.c:1.84.6.1 Fri Aug 25 05:38:06 2017 +++ src/sys/dev/pci/if_iwn.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwn.c,v 1.84.6.1 2017/08/25 05:38:06 snj Exp $ */ +/* $NetBSD: if_iwn.c,v 1.84.6.2 2017/12/10 10:10:24 snj Exp $ */ /* $OpenBSD: if_iwn.c,v 1.135 2014/09/10 07:22:09 dcoppa Exp $ */ /*- @@ -22,7 +22,7 @@ * adapters. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.84.6.1 2017/08/25 05:38:06 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.84.6.2 2017/12/10 10:10:24 snj Exp $"); #define IWN_USE_RBUF /* Use local storage for RX */ #undef IWN_HWCRYPTO /* XXX does not even compile yet */ @@ -596,7 +596,12 @@ iwn_attach(device_t parent __unused, dev IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail5; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -643,6 +648,7 @@ iwn_attach(device_t parent __unused, dev return; /* Free allocated memory if something failed during attachment. */ +fail5: iwn_free_rx_ring(sc, &sc->rxq); fail4: while (--i >= 0) iwn_free_tx_ring(sc, &sc->txq[i]); #ifdef IWN_USE_RBUF Index: src/sys/dev/pci/if_rtwn.c diff -u src/sys/dev/pci/if_rtwn.c:1.12 src/sys/dev/pci/if_rtwn.c:1.12.2.1 --- src/sys/dev/pci/if_rtwn.c:1.12 Thu May 18 01:32:46 2017 +++ src/sys/dev/pci/if_rtwn.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_rtwn.c,v 1.12 2017/05/18 01:32:46 nonaka Exp $ */ +/* $NetBSD: if_rtwn.c,v 1.12.2.1 2017/12/10 10:10:24 snj Exp $ */ /* $OpenBSD: if_rtwn.c,v 1.5 2015/06/14 08:02:47 stsp Exp $ */ #define IEEE80211_NO_HT /*- @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_rtwn.c,v 1.12 2017/05/18 01:32:46 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_rtwn.c,v 1.12.2.1 2017/12/10 10:10:24 snj Exp $"); #include <sys/param.h> #include <sys/sockio.h> @@ -357,7 +357,13 @@ rtwn_attach(device_t parent, device_t se IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + ifp->if_softc = NULL; /* For rtwn_detach() */ + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -389,6 +395,9 @@ rtwn_attach(device_t parent, device_t se if (!pmf_device_register(self, NULL, NULL)) aprint_error_dev(self, "couldn't establish power handler\n"); + +fail: + rtwn_detach(self, 0); } static int @@ -407,6 +416,7 @@ rtwn_detach(device_t self, int flags) if (ifp->if_softc != NULL) { rtwn_stop(ifp, 0); + pmf_device_deregister(self); ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); bpf_detach(ifp); ieee80211_ifdetach(ic); @@ -433,8 +443,6 @@ rtwn_detach(device_t self, int flags) pci_intr_release(sc->sc_pc, sc->sc_pihp, 1); } - pmf_device_deregister(self); - return 0; } Index: src/sys/dev/pci/if_wm.c diff -u src/sys/dev/pci/if_wm.c:1.508.4.8 src/sys/dev/pci/if_wm.c:1.508.4.9 --- src/sys/dev/pci/if_wm.c:1.508.4.8 Sun Dec 10 09:48:04 2017 +++ src/sys/dev/pci/if_wm.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.508.4.8 2017/12/10 09:48:04 snj Exp $ */ +/* $NetBSD: if_wm.c,v 1.508.4.9 2017/12/10 10:10:24 snj Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -83,7 +83,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.8 2017/12/10 09:48:04 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.508.4.9 2017/12/10 10:10:24 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_net_mpsafe.h" @@ -2759,7 +2759,12 @@ alloc_retry: #endif /* Attach the interface. */ - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + return; /* Error */ + } sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if); ether_ifattach(ifp, enaddr); if_register(ifp); Index: src/sys/dev/pci/if_wpi.c diff -u src/sys/dev/pci/if_wpi.c:1.78 src/sys/dev/pci/if_wpi.c:1.78.2.1 --- src/sys/dev/pci/if_wpi.c:1.78 Tue May 23 02:19:14 2017 +++ src/sys/dev/pci/if_wpi.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_wpi.c,v 1.78 2017/05/23 02:19:14 ozaki-r Exp $ */ +/* $NetBSD: if_wpi.c,v 1.78.2.1 2017/12/10 10:10:24 snj Exp $ */ /*- * Copyright (c) 2006, 2007 @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.78 2017/05/23 02:19:14 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wpi.c,v 1.78.2.1 2017/12/10 10:10:24 snj Exp $"); /* * Driver for Intel PRO/Wireless 3945ABG 802.11 network adapters. @@ -366,7 +366,12 @@ wpi_attach(device_t parent __unused, dev IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", + error); + goto fail5; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -409,6 +414,7 @@ wpi_attach(device_t parent __unused, dev return; /* free allocated memory if something failed during attachment */ +fail5: wpi_free_rx_ring(sc, &sc->rxq); fail4: wpi_free_tx_ring(sc, &sc->cmdq); fail3: while (--ac >= 0) wpi_free_tx_ring(sc, &sc->txq[ac]); Index: src/sys/dev/pci/ixgbe/ixgbe.c diff -u src/sys/dev/pci/ixgbe/ixgbe.c:1.88.2.4 src/sys/dev/pci/ixgbe/ixgbe.c:1.88.2.5 --- src/sys/dev/pci/ixgbe/ixgbe.c:1.88.2.4 Tue Nov 21 11:38:19 2017 +++ src/sys/dev/pci/ixgbe/ixgbe.c Sun Dec 10 10:10:24 2017 @@ -59,7 +59,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ /*$FreeBSD: head/sys/dev/ixgbe/if_ix.c 302384 2016-07-07 03:39:18Z sbruno $*/ -/*$NetBSD: ixgbe.c,v 1.88.2.4 2017/11/21 11:38:19 martin Exp $*/ +/*$NetBSD: ixgbe.c,v 1.88.2.5 2017/12/10 10:10:24 snj Exp $*/ #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -3122,6 +3122,7 @@ ixgbe_setup_interface(device_t dev, stru { struct ethercom *ec = &adapter->osdep.ec; struct ifnet *ifp; + int rv; INIT_DEBUGOUT("ixgbe_setup_interface: begin"); @@ -3149,7 +3150,11 @@ ixgbe_setup_interface(device_t dev, stru IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2); IFQ_SET_READY(&ifp->if_snd); - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(dev, "if_initialize failed(%d)\n", rv); + return rv; + } adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if); ether_ifattach(ifp, adapter->hw.mac.addr); /* Index: src/sys/dev/pci/ixgbe/ixv.c diff -u src/sys/dev/pci/ixgbe/ixv.c:1.56.2.1 src/sys/dev/pci/ixgbe/ixv.c:1.56.2.2 --- src/sys/dev/pci/ixgbe/ixv.c:1.56.2.1 Sat Sep 23 17:47:34 2017 +++ src/sys/dev/pci/ixgbe/ixv.c Sun Dec 10 10:10:24 2017 @@ -31,7 +31,7 @@ ******************************************************************************/ /*$FreeBSD: head/sys/dev/ixgbe/if_ixv.c 302384 2016-07-07 03:39:18Z sbruno $*/ -/*$NetBSD: ixv.c,v 1.56.2.1 2017/09/23 17:47:34 snj Exp $*/ +/*$NetBSD: ixv.c,v 1.56.2.2 2017/12/10 10:10:24 snj Exp $*/ #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -100,7 +100,7 @@ static int ixv_setup_msix(struct adapter static void ixv_free_pci_resources(struct adapter *); static void ixv_local_timer(void *); static void ixv_local_timer_locked(void *); -static void ixv_setup_interface(device_t, struct adapter *); +static int ixv_setup_interface(device_t, struct adapter *); static void ixv_config_link(struct adapter *); static void ixv_initialize_transmit_units(struct adapter *); @@ -442,7 +442,11 @@ ixv_attach(device_t parent, device_t dev adapter->enable_aim = ixv_enable_aim; /* Setup OS specific network interface */ - ixv_setup_interface(dev, adapter); + error = ixv_setup_interface(dev, adapter); + if (error != 0) { + aprint_error_dev(dev, "ixv_setup_interface() failed!\n"); + goto err_late; + } /* Do the stats setup */ ixv_save_stats(adapter); @@ -1663,11 +1667,12 @@ ixv_free_pci_resources(struct adapter * * Setup networking device structure and register an interface. * **********************************************************************/ -static void +static int ixv_setup_interface(device_t dev, struct adapter *adapter) { struct ethercom *ec = &adapter->osdep.ec; struct ifnet *ifp; + int rv; INIT_DEBUGOUT("ixv_setup_interface: begin"); @@ -1689,7 +1694,11 @@ ixv_setup_interface(device_t dev, struct IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2); IFQ_SET_READY(&ifp->if_snd); - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(dev, "if_initialize failed(%d)\n", rv); + return rv; + } adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if); ether_ifattach(ifp, adapter->hw.mac.addr); /* @@ -1741,7 +1750,7 @@ ixv_setup_interface(device_t dev, struct ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL); ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO); - return; + return 0; } static void Index: src/sys/dev/pcmcia/if_malo_pcmcia.c diff -u src/sys/dev/pcmcia/if_malo_pcmcia.c:1.13.6.1 src/sys/dev/pcmcia/if_malo_pcmcia.c:1.13.6.2 --- src/sys/dev/pcmcia/if_malo_pcmcia.c:1.13.6.1 Sun Dec 10 09:50:59 2017 +++ src/sys/dev/pcmcia/if_malo_pcmcia.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_malo_pcmcia.c,v 1.13.6.1 2017/12/10 09:50:59 snj Exp $ */ +/* $NetBSD: if_malo_pcmcia.c,v 1.13.6.2 2017/12/10 10:10:24 snj Exp $ */ /* $OpenBSD: if_malo.c,v 1.65 2009/03/29 21:53:53 sthen Exp $ */ /* @@ -18,7 +18,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_malo_pcmcia.c,v 1.13.6.1 2017/12/10 09:50:59 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_malo_pcmcia.c,v 1.13.6.2 2017/12/10 10:10:24 snj Exp $"); #ifdef _MODULE #include <sys/module.h> @@ -307,7 +307,7 @@ cmalo_attach(void *arg) struct malo_softc *sc = arg; struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &sc->sc_if; - int i; + int i, rv; /* disable interrupts */ cmalo_intr_mask(sc, 0); @@ -318,7 +318,7 @@ cmalo_attach(void *arg) cmalo_fw_load_main(sc) != 0) { /* free firmware */ cmalo_fw_free(sc); - return; + goto fail_1; } sc->sc_flags |= MALO_FW_LOADED; @@ -368,7 +368,11 @@ cmalo_attach(void *arg) } /* attach interface */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n", rv); + goto fail_2; + } ieee80211_ifattach(ic); /* Use common softint-based if_input */ ifp->if_percpuq = if_percpuq_create(ifp); @@ -386,6 +390,16 @@ cmalo_attach(void *arg) /* device attached */ sc->sc_flags |= MALO_DEVICE_ATTACHED; + + return; + +fail_2: + cv_destroy(&sc->sc_cv); + mutex_destroy(&sc->sc_mtx); + free(sc->sc_cmd, M_DEVBUF); + free(sc->sc_data, M_DEVBUF); +fail_1: + cmalo_fw_free(sc); } static void Index: src/sys/dev/scsipi/if_se.c diff -u src/sys/dev/scsipi/if_se.c:1.94 src/sys/dev/scsipi/if_se.c:1.94.8.1 --- src/sys/dev/scsipi/if_se.c:1.94 Thu Dec 15 09:28:06 2016 +++ src/sys/dev/scsipi/if_se.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_se.c,v 1.94 2016/12/15 09:28:06 ozaki-r Exp $ */ +/* $NetBSD: if_se.c,v 1.94.8.1 2017/12/10 10:10:24 snj Exp $ */ /* * Copyright (c) 1997 Ian W. Dall <ian.d...@dsto.defence.gov.au> @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.94 2016/12/15 09:28:06 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_se.c,v 1.94.8.1 2017/12/10 10:10:24 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -314,6 +314,7 @@ seattach(device_t parent, device_t self, struct scsipi_periph *periph = sa->sa_periph; struct ifnet *ifp = &sc->sc_ethercom.ec_if; u_int8_t myaddr[ETHER_ADDR_LEN]; + int rv; sc->sc_dev = self; @@ -363,7 +364,13 @@ seattach(device_t parent, device_t self, IFQ_SET_READY(&ifp->if_snd); /* Attach the interface. */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + free(sc->sc_tbuf, M_DEVBUF); + callout_destroy(&sc->sc_ifstart_ch); + callout_destroy(&sc->sc_recv_ch); + return; /* Error */ + } ether_ifattach(ifp, myaddr); if_register(ifp); } Index: src/sys/dev/usb/if_upl.c diff -u src/sys/dev/usb/if_upl.c:1.59 src/sys/dev/usb/if_upl.c:1.59.8.1 --- src/sys/dev/usb/if_upl.c:1.59 Thu Jan 12 18:26:08 2017 +++ src/sys/dev/usb/if_upl.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_upl.c,v 1.59 2017/01/12 18:26:08 maya Exp $ */ +/* $NetBSD: if_upl.c,v 1.59.8.1 2017/12/10 10:10:24 snj Exp $ */ /* * Copyright (c) 2000 The NetBSD Foundation, Inc. * All rights reserved. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.59 2017/01/12 18:26:08 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.59.8.1 2017/12/10 10:10:24 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -228,6 +228,7 @@ upl_attach(device_t parent, device_t sel usb_interface_descriptor_t *id; usb_endpoint_descriptor_t *ed; int i; + int rv; DPRINTFN(5,(" : upl_attach: sc=%p, dev=%p", sc, dev)); @@ -307,7 +308,12 @@ upl_attach(device_t parent, device_t sel IFQ_SET_READY(&ifp->if_snd); /* Attach the interface. */ - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error_dev(self, "if_initialize failed(%d)\n", rv); + splx(s); + return; + } if_register(ifp); if_alloc_sadl(ifp); Index: src/sys/net/if.c diff -u src/sys/net/if.c:1.394.2.2 src/sys/net/if.c:1.394.2.3 --- src/sys/net/if.c:1.394.2.2 Thu Nov 30 15:57:37 2017 +++ src/sys/net/if.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.394.2.2 2017/11/30 15:57:37 martin Exp $ */ +/* $NetBSD: if.c,v 1.394.2.3 2017/12/10 10:10:24 snj Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc. @@ -90,7 +90,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.394.2.2 2017/11/30 15:57:37 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.394.2.3 2017/12/10 10:10:24 snj Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -670,9 +670,11 @@ skip: * ether_ifattach(ifp, enaddr); * if_register(ifp); */ -void +int if_initialize(ifnet_t *ifp) { + int rv = 0; + KASSERT(if_indexlim > 0); TAILQ_INIT(&ifp->if_addrlist); @@ -711,8 +713,10 @@ if_initialize(ifnet_t *ifp) if (if_is_link_state_changeable(ifp)) { ifp->if_link_si = softint_establish(SOFTINT_NET, if_link_state_change_si, ifp); - if (ifp->if_link_si == NULL) - panic("%s: softint_establish() failed", __func__); + if (ifp->if_link_si == NULL) { + rv = ENOMEM; + goto fail; + } } PSLIST_ENTRY_INIT(ifp, if_pslist_entry); @@ -724,6 +728,18 @@ if_initialize(ifnet_t *ifp) IFNET_LOCK(); if_getindex(ifp); IFNET_UNLOCK(); + + return 0; + +fail: + IF_AFDATA_LOCK_DESTROY(ifp); + + pfil_run_ifhooks(if_pfil, PFIL_IFNET_DETACH, ifp); + (void)pfil_head_destroy(ifp->if_pfil); + + IFQ_LOCK_DESTROY(&ifp->if_snd); + + return rv; } /* @@ -1094,13 +1110,19 @@ if_input(struct ifnet *ifp, struct mbuf * migrate softint-based if_input without much changes. If you don't * want to enable it, use if_initialize instead. */ -void +int if_attach(ifnet_t *ifp) { + int rv; + + rv = if_initialize(ifp); + if (rv != 0) + return rv; - if_initialize(ifp); ifp->if_percpuq = if_percpuq_create(ifp); if_register(ifp); + + return 0; } void Index: src/sys/net/if.h diff -u src/sys/net/if.h:1.239.2.1 src/sys/net/if.h:1.239.2.2 --- src/sys/net/if.h:1.239.2.1 Sat Jul 1 08:56:06 2017 +++ src/sys/net/if.h Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if.h,v 1.239.2.1 2017/07/01 08:56:06 snj Exp $ */ +/* $NetBSD: if.h,v 1.239.2.2 2017/12/10 10:10:24 snj Exp $ */ /*- * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -923,6 +923,7 @@ do { \ #define IFQ_LOCK_INIT(ifq) (ifq)->ifq_lock = \ mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET) +#define IFQ_LOCK_DESTROY(ifq) mutex_obj_free((ifq)->ifq_lock) #define IFQ_LOCK(ifq) mutex_enter((ifq)->ifq_lock) #define IFQ_UNLOCK(ifq) mutex_exit((ifq)->ifq_lock) @@ -946,9 +947,9 @@ void if_activate_sadl(struct ifnet *, st const struct sockaddr_dl *); void if_set_sadl(struct ifnet *, const void *, u_char, bool); void if_alloc_sadl(struct ifnet *); -void if_initialize(struct ifnet *); +int if_initialize(struct ifnet *); void if_register(struct ifnet *); -void if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */ +int if_attach(struct ifnet *); /* Deprecated. Use if_initialize and if_register */ void if_attachdomain(void); void if_deactivate(struct ifnet *); bool if_is_deactivated(const struct ifnet *); Index: src/sys/net/if_arc.h diff -u src/sys/net/if_arc.h:1.22 src/sys/net/if_arc.h:1.22.90.1 --- src/sys/net/if_arc.h:1.22 Wed Feb 20 17:05:52 2008 +++ src/sys/net/if_arc.h Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_arc.h,v 1.22 2008/02/20 17:05:52 matt Exp $ */ +/* $NetBSD: if_arc.h,v 1.22.90.1 2017/12/10 10:10:24 snj Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -118,7 +118,7 @@ struct arccom { extern uint8_t arcbroadcastaddr; extern int arc_ipmtu; /* XXX new ip only, no RFC 1051! */ -void arc_ifattach(struct ifnet *, uint8_t); +int arc_ifattach(struct ifnet *, uint8_t); char *arc_sprintf(uint8_t *); int arc_isphds(uint8_t); #endif Index: src/sys/net/if_arcsubr.c diff -u src/sys/net/if_arcsubr.c:1.77 src/sys/net/if_arcsubr.c:1.77.6.1 --- src/sys/net/if_arcsubr.c:1.77 Tue Feb 14 03:05:06 2017 +++ src/sys/net/if_arcsubr.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_arcsubr.c,v 1.77 2017/02/14 03:05:06 ozaki-r Exp $ */ +/* $NetBSD: if_arcsubr.c,v 1.77.6.1 2017/12/10 10:10:24 snj Exp $ */ /* * Copyright (c) 1994, 1995 Ignatios Souvatzis @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.77 2017/02/14 03:05:06 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_arcsubr.c,v 1.77.6.1 2017/12/10 10:10:24 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -610,10 +610,11 @@ arc_sprintf(uint8_t *ap) /* * Perform common duties while attaching to interface list */ -void +int arc_ifattach(struct ifnet *ifp, uint8_t lla) { struct arccom *ac; + int rv; ifp->if_type = IFT_ARCNET; ifp->if_addrlen = 1; @@ -635,10 +636,15 @@ arc_ifattach(struct ifnet *ifp, uint8_t log(LOG_ERR,"%s: link address 0 reserved for broadcasts. Please change it and ifconfig %s down up\n", ifp->if_xname, ifp->if_xname); } - if_attach(ifp); + rv = if_attach(ifp); + if (rv != 0) + return rv; + if_set_sadl(ifp, &lla, sizeof(lla), true); ifp->if_broadcastaddr = &arcbroadcastaddr; bpf_attach(ifp, DLT_ARCNET, ARC_HDRLEN); + + return 0; } Index: src/sys/net/if_bridge.c diff -u src/sys/net/if_bridge.c:1.134.6.3 src/sys/net/if_bridge.c:1.134.6.4 --- src/sys/net/if_bridge.c:1.134.6.3 Thu Nov 23 13:34:24 2017 +++ src/sys/net/if_bridge.c Sun Dec 10 10:10:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_bridge.c,v 1.134.6.3 2017/11/23 13:34:24 martin Exp $ */ +/* $NetBSD: if_bridge.c,v 1.134.6.4 2017/12/10 10:10:24 snj Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -80,7 +80,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.134.6.3 2017/11/23 13:34:24 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.134.6.4 2017/12/10 10:10:24 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_bridge_ipf.h" @@ -436,12 +436,23 @@ bridge_clone_create(struct if_clone *ifc ifp->if_dlt = DLT_EN10MB; ifp->if_hdrlen = ETHER_HDR_LEN; - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + pserialize_destroy(sc->sc_iflist_psref.bip_psz); + mutex_destroy(&sc->sc_iflist_psref.bip_lock); + callout_destroy(&sc->sc_brcallout); + callout_destroy(&sc->sc_bstpcallout); + workqueue_destroy(sc->sc_rtage_wq); + bridge_rtable_fini(sc); + kmem_free(sc, sizeof(*sc)); + + return error; + } if_register(ifp); if_alloc_sadl(ifp); - return (0); + return 0; } /* @@ -480,12 +491,12 @@ bridge_clone_destroy(struct ifnet *ifp) pserialize_destroy(sc->sc_iflist_psref.bip_psz); mutex_destroy(&sc->sc_iflist_psref.bip_lock); - + callout_destroy(&sc->sc_brcallout); + callout_destroy(&sc->sc_bstpcallout); workqueue_destroy(sc->sc_rtage_wq); - kmem_free(sc, sizeof(*sc)); - return (0); + return 0; } /* @@ -530,7 +541,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV, ifd, NULL, NULL); if (error) - return (error); + return error; break; } @@ -618,7 +629,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c splx(s); - return (error); + return error; } /* @@ -733,7 +744,7 @@ bridge_ioctl_add(struct bridge_softc *sc ifs = if_get(req->ifbr_ifsname, &psref); if (ifs == NULL) - return (ENOENT); + return ENOENT; if (ifs->if_bridge == sc) { error = EEXIST; @@ -807,7 +818,7 @@ bridge_ioctl_add(struct bridge_softc *sc if (bif != NULL) kmem_free(bif, sizeof(*bif)); } - return (error); + return error; } static int @@ -873,7 +884,7 @@ bridge_ioctl_gifflags(struct bridge_soft bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref); if (bif == NULL) - return (ENOENT); + return ENOENT; req->ifbr_ifsflags = bif->bif_flags; req->ifbr_state = bif->bif_state; @@ -883,7 +894,7 @@ bridge_ioctl_gifflags(struct bridge_soft bridge_release_member(sc, bif, &psref); - return (0); + return 0; } static int @@ -895,7 +906,7 @@ bridge_ioctl_sifflags(struct bridge_soft bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref); if (bif == NULL) - return (ENOENT); + return ENOENT; if (req->ifbr_ifsflags & IFBIF_STP) { switch (bif->bif_ifp->if_type) { @@ -907,7 +918,7 @@ bridge_ioctl_sifflags(struct bridge_soft default: /* Nothing else can. */ bridge_release_member(sc, bif, &psref); - return (EINVAL); + return EINVAL; } } @@ -918,7 +929,7 @@ bridge_ioctl_sifflags(struct bridge_soft if (sc->sc_if.if_flags & IFF_RUNNING) bstp_initialization(sc); - return (0); + return 0; } static int @@ -929,7 +940,7 @@ bridge_ioctl_scache(struct bridge_softc sc->sc_brtmax = param->ifbrp_csize; bridge_rttrim(sc); - return (0); + return 0; } static int @@ -939,7 +950,7 @@ bridge_ioctl_gcache(struct bridge_softc param->ifbrp_csize = sc->sc_brtmax; - return (0); + return 0; } static int @@ -1023,7 +1034,7 @@ bridge_ioctl_rts(struct bridge_softc *sc int count = 0, error = 0, len; if (bac->ifbac_len == 0) - return (0); + return 0; BRIDGE_RT_LOCK(sc); @@ -1051,7 +1062,7 @@ bridge_ioctl_rts(struct bridge_softc *sc BRIDGE_RT_UNLOCK(sc); bac->ifbac_len = sizeof(bareq) * count; - return (error); + return error; } static int @@ -1064,14 +1075,14 @@ bridge_ioctl_saddr(struct bridge_softc * bif = bridge_lookup_member(sc, req->ifba_ifsname, &psref); if (bif == NULL) - return (ENOENT); + return ENOENT; error = bridge_rtupdate(sc, req->ifba_dst, bif->bif_ifp, 1, req->ifba_flags); bridge_release_member(sc, bif, &psref); - return (error); + return error; } static int @@ -1081,7 +1092,7 @@ bridge_ioctl_sto(struct bridge_softc *sc sc->sc_brttimeout = param->ifbrp_ctime; - return (0); + return 0; } static int @@ -1091,7 +1102,7 @@ bridge_ioctl_gto(struct bridge_softc *sc param->ifbrp_ctime = sc->sc_brttimeout; - return (0); + return 0; } static int @@ -1109,7 +1120,7 @@ bridge_ioctl_flush(struct bridge_softc * bridge_rtflush(sc, req->ifbr_ifsflags); - return (0); + return 0; } static int @@ -1119,7 +1130,7 @@ bridge_ioctl_gpri(struct bridge_softc *s param->ifbrp_prio = sc->sc_bridge_priority; - return (0); + return 0; } static int @@ -1132,7 +1143,7 @@ bridge_ioctl_spri(struct bridge_softc *s if (sc->sc_if.if_flags & IFF_RUNNING) bstp_initialization(sc); - return (0); + return 0; } static int @@ -1142,7 +1153,7 @@ bridge_ioctl_ght(struct bridge_softc *sc param->ifbrp_hellotime = sc->sc_bridge_hello_time >> 8; - return (0); + return 0; } static int @@ -1151,13 +1162,13 @@ bridge_ioctl_sht(struct bridge_softc *sc struct ifbrparam *param = arg; if (param->ifbrp_hellotime == 0) - return (EINVAL); + return EINVAL; sc->sc_bridge_hello_time = param->ifbrp_hellotime << 8; if (sc->sc_if.if_flags & IFF_RUNNING) bstp_initialization(sc); - return (0); + return 0; } static int @@ -1167,7 +1178,7 @@ bridge_ioctl_gfd(struct bridge_softc *sc param->ifbrp_fwddelay = sc->sc_bridge_forward_delay >> 8; - return (0); + return 0; } static int @@ -1176,13 +1187,13 @@ bridge_ioctl_sfd(struct bridge_softc *sc struct ifbrparam *param = arg; if (param->ifbrp_fwddelay == 0) - return (EINVAL); + return EINVAL; sc->sc_bridge_forward_delay = param->ifbrp_fwddelay << 8; if (sc->sc_if.if_flags & IFF_RUNNING) bstp_initialization(sc); - return (0); + return 0; } static int @@ -1192,7 +1203,7 @@ bridge_ioctl_gma(struct bridge_softc *sc param->ifbrp_maxage = sc->sc_bridge_max_age >> 8; - return (0); + return 0; } static int @@ -1201,13 +1212,13 @@ bridge_ioctl_sma(struct bridge_softc *sc struct ifbrparam *param = arg; if (param->ifbrp_maxage == 0) - return (EINVAL); + return EINVAL; sc->sc_bridge_max_age = param->ifbrp_maxage << 8; if (sc->sc_if.if_flags & IFF_RUNNING) bstp_initialization(sc); - return (0); + return 0; } static int @@ -1219,7 +1230,7 @@ bridge_ioctl_sifprio(struct bridge_softc bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref); if (bif == NULL) - return (ENOENT); + return ENOENT; bif->bif_priority = req->ifbr_priority; @@ -1228,7 +1239,7 @@ bridge_ioctl_sifprio(struct bridge_softc bridge_release_member(sc, bif, &psref); - return (0); + return 0; } #if defined(BRIDGE_IPF) @@ -1239,7 +1250,7 @@ bridge_ioctl_gfilt(struct bridge_softc * param->ifbrp_filter = sc->sc_filter_flags; - return (0); + return 0; } static int @@ -1249,7 +1260,7 @@ bridge_ioctl_sfilt(struct bridge_softc * uint32_t nflags, oflags; if (param->ifbrp_filter & ~IFBF_FILT_MASK) - return (EINVAL); + return EINVAL; nflags = param->ifbrp_filter; oflags = sc->sc_filter_flags; @@ -1265,7 +1276,7 @@ bridge_ioctl_sfilt(struct bridge_softc * sc->sc_filter_flags = nflags; - return (0); + return 0; } #endif /* BRIDGE_IPF */ @@ -1278,7 +1289,7 @@ bridge_ioctl_sifcost(struct bridge_softc bif = bridge_lookup_member(sc, req->ifbr_ifsname, &psref); if (bif == NULL) - return (ENOENT); + return ENOENT; bif->bif_path_cost = req->ifbr_path_cost; @@ -1287,7 +1298,7 @@ bridge_ioctl_sifcost(struct bridge_softc bridge_release_member(sc, bif, &psref); - return (0); + return 0; } /* @@ -1322,14 +1333,14 @@ bridge_init(struct ifnet *ifp) struct bridge_softc *sc = ifp->if_softc; if (ifp->if_flags & IFF_RUNNING) - return (0); + return 0; callout_reset(&sc->sc_brcallout, bridge_rtable_prune_period * hz, bridge_timer, sc); ifp->if_flags |= IFF_RUNNING; bstp_initialization(sc); - return (0); + return 0; } /* @@ -1440,7 +1451,7 @@ bridge_output(struct ifnet *ifp, struct if (m->m_len < ETHER_HDR_LEN) { m = m_pullup(m, ETHER_HDR_LEN); if (m == NULL) - return (0); + return 0; } eh = mtod(m, struct ether_header *); @@ -1566,7 +1577,7 @@ next: if (!used) m_freem(m); - return (0); + return 0; } sendunicast: @@ -1576,12 +1587,12 @@ next: if ((dst_if->if_flags & IFF_RUNNING) == 0) { m_freem(m); - return (0); + return 0; } bridge_enqueue(sc, dst_if, m, 0); - return (0); + return 0; } /* @@ -2395,12 +2406,12 @@ bridge_rtnode_lookup(struct bridge_softc LIST_FOREACH(brt, &sc->sc_rthash[hash], brt_hash) { dir = memcmp(addr, brt->brt_addr, ETHER_ADDR_LEN); if (dir == 0) - return (brt); + return brt; if (dir > 0) - return (NULL); + return NULL; } - return (NULL); + return NULL; } /* @@ -2429,7 +2440,7 @@ bridge_rtnode_insert(struct bridge_softc do { dir = memcmp(brt->brt_addr, lbrt->brt_addr, ETHER_ADDR_LEN); if (dir == 0) - return (EEXIST); + return EEXIST; if (dir > 0) { LIST_INSERT_BEFORE(lbrt, brt, brt_hash); goto out; @@ -2449,7 +2460,7 @@ bridge_rtnode_insert(struct bridge_softc LIST_INSERT_HEAD(&sc->sc_rtlist, brt, brt_list); sc->sc_brtcnt++; - return (0); + return 0; } /* Index: src/sys/net/if_etherip.c diff -u src/sys/net/if_etherip.c:1.38 src/sys/net/if_etherip.c:1.38.10.1 --- src/sys/net/if_etherip.c:1.38 Mon Jul 11 11:31:51 2016 +++ src/sys/net/if_etherip.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_etherip.c,v 1.38 2016/07/11 11:31:51 msaitoh Exp $ */ +/* $NetBSD: if_etherip.c,v 1.38.10.1 2017/12/10 10:10:25 snj Exp $ */ /* * Copyright (c) 2006, Hans Rosenfeld <rosenf...@grumpf.hope-2000.org> @@ -86,7 +86,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.38 2016/07/11 11:31:51 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.38.10.1 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -266,7 +266,13 @@ etherip_attach(device_t parent, device_t * Those steps are mandatory for an Ethernet driver, the first call * being common to all network interface drivers. */ - if_attach(ifp); + error = if_attach(ifp); + if (error != 0) { + aprint_error_dev(self, "if_attach failed(%d)\n", error); + ifmedia_delete_instance(&sc->sc_im, IFM_INST_ANY); + pmf_device_deregister(self); + return; + } ether_ifattach(ifp, enaddr); /* Index: src/sys/net/if_faith.c diff -u src/sys/net/if_faith.c:1.55 src/sys/net/if_faith.c:1.55.8.1 --- src/sys/net/if_faith.c:1.55 Mon Dec 12 03:55:57 2016 +++ src/sys/net/if_faith.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_faith.c,v 1.55 2016/12/12 03:55:57 ozaki-r Exp $ */ +/* $NetBSD: if_faith.c,v 1.55.8.1 2017/12/10 10:10:25 snj Exp $ */ /* $KAME: if_faith.c,v 1.21 2001/02/20 07:59:26 itojun Exp $ */ /* @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.55 2016/12/12 03:55:57 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.55.8.1 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -140,6 +140,7 @@ static int faith_clone_create(struct if_clone *ifc, int unit) { struct ifnet *ifp; + int rv; ifp = if_alloc(IFT_FAITH); @@ -154,7 +155,11 @@ faith_clone_create(struct if_clone *ifc, ifp->if_hdrlen = 0; ifp->if_addrlen = 0; ifp->if_dlt = DLT_NULL; - if_attach(ifp); + rv = if_attach(ifp); + if (rv != 0) { + if_free(ifp); + return rv; + } if_alloc_sadl(ifp); bpf_attach(ifp, DLT_NULL, sizeof(u_int)); atomic_inc_uint(&faith_count); Index: src/sys/net/if_gif.c diff -u src/sys/net/if_gif.c:1.126.2.3 src/sys/net/if_gif.c:1.126.2.4 --- src/sys/net/if_gif.c:1.126.2.3 Tue Oct 24 08:47:24 2017 +++ src/sys/net/if_gif.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gif.c,v 1.126.2.3 2017/10/24 08:47:24 snj Exp $ */ +/* $NetBSD: if_gif.c,v 1.126.2.4 2017/12/10 10:10:25 snj Exp $ */ /* $KAME: if_gif.c,v 1.76 2001/08/20 02:01:02 kjc Exp $ */ /* @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.126.2.3 2017/10/24 08:47:24 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.126.2.4 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -105,7 +105,7 @@ static struct { static void gif_ro_init_pc(void *, void *, struct cpu_info *); static void gif_ro_fini_pc(void *, void *, struct cpu_info *); -static void gifattach0(struct gif_softc *); +static int gifattach0(struct gif_softc *); static int gif_output(struct ifnet *, struct mbuf *, const struct sockaddr *, const struct rtentry *); static void gif_start(struct ifnet *); @@ -242,12 +242,17 @@ static int gif_clone_create(struct if_clone *ifc, int unit) { struct gif_softc *sc; + int rv; sc = kmem_zalloc(sizeof(struct gif_softc), KM_SLEEP); if_initname(&sc->gif_if, ifc->ifc_name, unit); - gifattach0(sc); + rv = gifattach0(sc); + if (rv != 0) { + kmem_free(sc, sizeof(struct gif_softc)); + return rv; + } sc->gif_ro_percpu = percpu_alloc(sizeof(struct gif_ro)); percpu_foreach(sc->gif_ro_percpu, gif_ro_init_pc, NULL); @@ -255,12 +260,13 @@ gif_clone_create(struct if_clone *ifc, i mutex_enter(&gif_softcs.lock); LIST_INSERT_HEAD(&gif_softcs.list, sc, gif_list); mutex_exit(&gif_softcs.lock); - return (0); + return 0; } -static void +static int gifattach0(struct gif_softc *sc) { + int rv; sc->encap_cookie4 = sc->encap_cookie6 = NULL; @@ -279,10 +285,14 @@ gifattach0(struct gif_softc *sc) sc->gif_if.if_dlt = DLT_NULL; sc->gif_if.if_softc = sc; IFQ_SET_READY(&sc->gif_if.if_snd); - if_initialize(&sc->gif_if); + rv = if_initialize(&sc->gif_if); + if (rv != 0) + return rv; + if_register(&sc->gif_if); if_alloc_sadl(&sc->gif_if); bpf_attach(&sc->gif_if, DLT_NULL, sizeof(u_int)); + return 0; } static void @@ -327,7 +337,7 @@ gif_clone_destroy(struct ifnet *ifp) kmem_free(sc, sizeof(struct gif_softc)); - return (0); + return 0; } #ifdef GIF_ENCAPCHECK Index: src/sys/net/if_loop.c diff -u src/sys/net/if_loop.c:1.94.6.2 src/sys/net/if_loop.c:1.94.6.3 --- src/sys/net/if_loop.c:1.94.6.2 Thu Nov 23 02:13:31 2017 +++ src/sys/net/if_loop.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_loop.c,v 1.94.6.2 2017/11/23 02:13:31 snj Exp $ */ +/* $NetBSD: if_loop.c,v 1.94.6.3 2017/12/10 10:10:25 snj Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.94.6.2 2017/11/23 02:13:31 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.94.6.3 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -175,6 +175,7 @@ static int loop_clone_create(struct if_clone *ifc, int unit) { struct ifnet *ifp; + int rv; ifp = if_alloc(IFT_LOOP); @@ -195,7 +196,11 @@ loop_clone_create(struct if_clone *ifc, IFQ_SET_READY(&ifp->if_snd); if (unit == 0) lo0ifp = ifp; - if_attach(ifp); + rv = if_attach(ifp); + if (rv != 0) { + if_free(ifp); + return rv; + } if_alloc_sadl(ifp); bpf_attach(ifp, DLT_NULL, sizeof(u_int)); #ifdef MBUFTRACE Index: src/sys/net/if_mpls.c diff -u src/sys/net/if_mpls.c:1.29 src/sys/net/if_mpls.c:1.29.8.1 --- src/sys/net/if_mpls.c:1.29 Mon Dec 12 03:55:57 2016 +++ src/sys/net/if_mpls.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mpls.c,v 1.29 2016/12/12 03:55:57 ozaki-r Exp $ */ +/* $NetBSD: if_mpls.c,v 1.29.8.1 2017/12/10 10:10:25 snj Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.29 2016/12/12 03:55:57 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.29.8.1 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -149,6 +149,7 @@ static int mpls_clone_create(struct if_clone *ifc, int unit) { struct mpls_softc *sc; + int rv; atomic_inc_uint(&mpls_count); sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO); @@ -165,7 +166,12 @@ mpls_clone_create(struct if_clone *ifc, sc->sc_if.if_output = mpls_output; sc->sc_if.if_ioctl = mpls_ioctl; - if_attach(&sc->sc_if); + rv = if_attach(&sc->sc_if); + if (rv != 0) { + free(sc, M_DEVBUF); + atomic_dec_uint(&mpls_count); + return rv; + } if_alloc_sadl(&sc->sc_if); bpf_attach(&sc->sc_if, DLT_NULL, sizeof(uint32_t)); return 0; Index: src/sys/net/if_pppoe.c diff -u src/sys/net/if_pppoe.c:1.125.6.3 src/sys/net/if_pppoe.c:1.125.6.4 --- src/sys/net/if_pppoe.c:1.125.6.3 Fri Dec 8 06:12:35 2017 +++ src/sys/net/if_pppoe.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_pppoe.c,v 1.125.6.3 2017/12/08 06:12:35 msaitoh Exp $ */ +/* $NetBSD: if_pppoe.c,v 1.125.6.4 2017/12/10 10:10:25 snj Exp $ */ /*- * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.125.6.3 2017/12/08 06:12:35 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.125.6.4 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "pppoe.h" @@ -221,7 +221,8 @@ static int pppoe_send_padt(struct ifnet static int pppoe_output(struct pppoe_softc *, struct mbuf *); /* internal helper functions */ -static struct pppoe_softc * pppoe_find_softc_by_session(u_int, struct ifnet *, krw_t); +static struct pppoe_softc * pppoe_find_softc_by_session(u_int, struct ifnet *, + krw_t); static struct pppoe_softc * pppoe_find_softc_by_hunique(uint8_t *, size_t, struct ifnet *, krw_t); static struct mbuf *pppoe_get_mbuf(size_t len); @@ -291,6 +292,7 @@ static int pppoe_clone_create(struct if_clone *ifc, int unit) { struct pppoe_softc *sc; + int rv; sc = malloc(sizeof(struct pppoe_softc), M_DEVBUF, M_WAITOK|M_ZERO); @@ -323,7 +325,13 @@ pppoe_clone_create(struct if_clone *ifc, sc->sc_sppp.pp_tlf = pppoe_tlf; sc->sc_sppp.pp_framebytes = PPPOE_HEADERLEN; /* framing added to ppp packets */ - if_initialize(&sc->sc_sppp.pp_if); + rv = if_initialize(&sc->sc_sppp.pp_if); + if (rv != 0) { + callout_halt(&sc->sc_timeout, NULL); + callout_destroy(&sc->sc_timeout); + free(sc, M_DEVBUF); + return rv; + } sc->sc_sppp.pp_if.if_percpuq = if_percpuq_create(&sc->sc_sppp.pp_if); sppp_attach(&sc->sc_sppp.pp_if); if_register(&sc->sc_sppp.pp_if); @@ -358,7 +366,6 @@ pppoe_clone_destroy(struct ifnet *ifp) } rw_exit(&pppoe_softc_list_lock); - bpf_detach(ifp); sppp_detach(&sc->sc_sppp.pp_if); if_detach(ifp); @@ -377,7 +384,7 @@ pppoe_clone_destroy(struct ifnet *ifp) free(sc, M_DEVBUF); - return (0); + return 0; } /* @@ -632,8 +639,9 @@ pppoe_dispatch_disc_pkt(struct mbuf *m, #endif rcvif = m_get_rcvif_psref(m, &psref); if (rcvif != NULL) { - sc = pppoe_find_softc_by_hunique(mtod(n, char *) + noff, - len, rcvif, RW_READER); + sc = pppoe_find_softc_by_hunique( + mtod(n, char *) + noff, len, rcvif, + RW_READER); } m_put_rcvif_psref(rcvif, &psref); if (sc != NULL) { @@ -1013,8 +1021,7 @@ pppoe_data_input(struct mbuf *m) struct mbuf *p; printf("%s: pkthdr.len=%d, pppoe.len=%d", - sc->sc_sppp.pp_if.if_xname, - m->m_pkthdr.len, plen); + sc->sc_sppp.pp_if.if_xname, m->m_pkthdr.len, plen); p = m; while (p) { printf(" l=%d", p->m_len); @@ -1028,7 +1035,10 @@ pppoe_data_input(struct mbuf *m) if (m->m_pkthdr.len < plen) goto drop; - /* fix incoming interface pointer (not the raw ethernet interface anymore) */ + /* + * Fix incoming interface pointer (not the raw ethernet interface + * anymore) + */ m_set_rcvif(m, &sc->sc_sppp.pp_if); /* pass packet up and account for it */ @@ -1055,7 +1065,8 @@ pppoe_output(struct pppoe_softc *sc, str memset(&dst, 0, sizeof dst); dst.sa_family = AF_UNSPEC; eh = (struct ether_header*)&dst.sa_data; - etype = sc->sc_state == PPPOE_STATE_SESSION ? ETHERTYPE_PPPOE : ETHERTYPE_PPPOEDISC; + etype = sc->sc_state == PPPOE_STATE_SESSION + ? ETHERTYPE_PPPOE : ETHERTYPE_PPPOEDISC; eh->ether_type = htons(etype); memcpy(&eh->ether_dhost, &sc->sc_dest, sizeof sc->sc_dest); @@ -1086,7 +1097,7 @@ pppoe_ioctl(struct ifnet *ifp, unsigned if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_INTERFACE, KAUTH_REQ_NETWORK_INTERFACE_SETPRIV, ifp, (void *)cmd, NULL) != 0) - return (EPERM); + return EPERM; if (parms->eth_ifname[0] != 0) { struct ifnet *eth_if; @@ -1377,8 +1388,7 @@ pppoe_timeout(void *arg) if (sc->sc_sppp.pp_if.if_flags & IFF_DEBUG) printf("%s: failed to send PADI" ", error=%d\n", - sc->sc_sppp.pp_if.if_xname, - err); + sc->sc_sppp.pp_if.if_xname, err); } callout_reset(&sc->sc_timeout, PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), @@ -1456,7 +1466,8 @@ pppoe_disconnect(struct pppoe_softc *sc) if (sc->sc_sppp.pp_if.if_flags & IFF_DEBUG) printf("%s: disconnecting\n", sc->sc_sppp.pp_if.if_xname); - err = pppoe_send_padt(sc->sc_eth_if, sc->sc_session, (const uint8_t *)&sc->sc_dest); + err = pppoe_send_padt(sc->sc_eth_if, sc->sc_session, + (const uint8_t *)&sc->sc_dest); } /* cleanup softc */ Index: src/sys/net/if_srt.c diff -u src/sys/net/if_srt.c:1.26 src/sys/net/if_srt.c:1.26.6.1 --- src/sys/net/if_srt.c:1.26 Tue Feb 14 03:05:06 2017 +++ src/sys/net/if_srt.c Sun Dec 10 10:10:25 2017 @@ -1,8 +1,8 @@ -/* $NetBSD: if_srt.c,v 1.26 2017/02/14 03:05:06 ozaki-r Exp $ */ +/* $NetBSD: if_srt.c,v 1.26.6.1 2017/12/10 10:10:25 snj Exp $ */ /* This file is in the public domain. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.26 2017/02/14 03:05:06 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_srt.c,v 1.26.6.1 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -88,7 +88,7 @@ update_mtu(struct srt_softc *sc) if (sc->flags & SSF_MTULOCK) return; mtu = 65535; - for (i=sc->nrt-1;i>=0;i--) { + for (i = sc->nrt-1; i>=0; i--) { r = sc->rts[i]; if (r->u.dstifp->if_mtu < mtu) mtu = r->u.dstifp->if_mtu; @@ -249,12 +249,13 @@ static int srt_clone_create(struct if_clone *cl, int unit) { struct srt_softc *sc; + int rv; if (unit < 0 || unit > SRT_MAXUNIT) return ENXIO; if (softcv[unit]) return EBUSY; - sc = malloc(sizeof(struct srt_softc), M_DEVBUF, M_WAITOK|M_ZERO); + sc = malloc(sizeof(struct srt_softc), M_DEVBUF, M_WAITOK | M_ZERO); sc->unit = unit; sc->nrt = 0; sc->rts = 0; @@ -268,7 +269,13 @@ srt_clone_create(struct if_clone *cl, in sc->intf.if_ioctl = &srt_if_ioctl; sc->intf.if_output = &srt_if_output; sc->intf.if_dlt = DLT_RAW; - if_attach(&sc->intf); + rv = if_attach(&sc->intf); + if (rv != 0) { + aprint_error("%s: if_initialize failed(%d)\n", + sc->intf.if_xname, rv); + free(sc, M_DEVBUF); + return rv; + } if_alloc_sadl(&sc->intf); #ifdef BPFILTER_NOW_AVAILABLE bpf_attach(&sc->intf, 0, 0); @@ -295,16 +302,16 @@ srt_clone_destroy(struct ifnet *ifp) } if (softcv[sc->unit] != sc) { panic("srt_clone_destroy: bad backpointer ([%d]=%p not %p)\n", - sc->unit,(void *)softcv[sc->unit],(void *)sc); + sc->unit, (void *)softcv[sc->unit], (void *)sc); } softcv[sc->unit] = 0; - free(sc,M_DEVBUF); + free(sc, M_DEVBUF); atomic_inc_uint(&srt_count); return 0; } struct if_clone srt_clone = - IF_CLONE_INITIALIZER("srt",&srt_clone_create,&srt_clone_destroy); + IF_CLONE_INITIALIZER("srt", &srt_clone_create, &srt_clone_destroy); void srtattach(int n) @@ -408,8 +415,9 @@ srt_ioctl(dev_t dev, u_long cmd, void *d dr->af = scr->af; dr->srcmatch = scr->srcmatch; dr->srcmask = scr->srcmask; - strlcpy(&dr->u.dstifn[0],&scr->u.dstifp->if_xname[0],IFNAMSIZ); - memcpy(&dr->dst,&scr->dst,scr->dst.sa.sa_len); + strlcpy(&dr->u.dstifn[0], &scr->u.dstifp->if_xname[0], + IFNAMSIZ); + memcpy(&dr->dst, &scr->dst, scr->dst.sa.sa_len); return 0; case SRT_SETRT: if (! (flag & FWRITE)) @@ -417,7 +425,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d dr = (struct srt_rt *) data; if (dr->inx > sc->nrt) return EDOM; - strlcpy(&nbuf[0],&dr->u.dstifn[0],IFNAMSIZ); + strlcpy(&nbuf[0], &dr->u.dstifn[0], IFNAMSIZ); nbuf[IFNAMSIZ-1] = '\0'; if (dr->dst.sa.sa_family != dr->af) return EIO; @@ -460,7 +468,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d } scr = sc->rts[dr->inx]; if (scr == 0) { - scr = malloc(sizeof(struct srt_rt),M_DEVBUF,M_WAITOK); + scr = malloc(sizeof(struct srt_rt), M_DEVBUF,M_WAITOK); if (scr == 0) return ENOBUFS; scr->inx = dr->inx; @@ -488,7 +496,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d sc->nrt--; if (i < sc->nrt) { memcpy(sc->rts+i, sc->rts+i+1, - (sc->nrt-i)*sizeof(*sc->rts)); + (sc->nrt-i) * sizeof(*sc->rts)); } if (sc->nrt == 0) { free(sc->rts, M_DEVBUF); @@ -510,7 +518,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *d *(unsigned int *)data = sc->flags | global_flags; return 0; case SRT_SGFLAGS: - if ((flag & (FWRITE|FREAD)) != (FWRITE|FREAD)) + if ((flag & (FWRITE | FREAD)) != (FWRITE | FREAD)) return EBADF; o = sc->flags | global_flags; n = *(unsigned int *)data & SSF_UCHG; Index: src/sys/net/if_stf.c diff -u src/sys/net/if_stf.c:1.101.8.1 src/sys/net/if_stf.c:1.101.8.2 --- src/sys/net/if_stf.c:1.101.8.1 Sun Dec 10 09:41:31 2017 +++ src/sys/net/if_stf.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_stf.c,v 1.101.8.1 2017/12/10 09:41:31 snj Exp $ */ +/* $NetBSD: if_stf.c,v 1.101.8.2 2017/12/10 10:10:25 snj Exp $ */ /* $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */ /* @@ -75,7 +75,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.101.8.1 2017/12/10 09:41:31 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.101.8.2 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -220,7 +220,7 @@ stf_clone_create(struct if_clone *ifc, i /* Only one stf interface is allowed. */ encap_lock_exit(); free(sc, M_DEVBUF); - return (EEXIST); + return EEXIST; } sc->encap_cookie = encap_attach_func(AF_INET, IPPROTO_IPV6, @@ -229,7 +229,7 @@ stf_clone_create(struct if_clone *ifc, i if (sc->encap_cookie == NULL) { printf("%s: unable to attach encap\n", if_name(&sc->sc_if)); free(sc, M_DEVBUF); - return (EIO); /* XXX */ + return EIO; /* XXX */ } sc->sc_if.if_mtu = STF_MTU; @@ -238,11 +238,20 @@ stf_clone_create(struct if_clone *ifc, i sc->sc_if.if_output = stf_output; sc->sc_if.if_type = IFT_STF; sc->sc_if.if_dlt = DLT_NULL; - if_attach(&sc->sc_if); + error = if_attach(&sc->sc_if); + if (error != 0) { + aprint_error("%s: if_initialize failed(%d)\n", + if_name(&sc->sc_if), error); + encap_lock_enter(); + encap_detach(sc->encap_cookie); + encap_lock_exit(); + free(sc, M_DEVBUF); + return error; + } if_alloc_sadl(&sc->sc_if); bpf_attach(&sc->sc_if, DLT_NULL, sizeof(u_int)); LIST_INSERT_HEAD(&stf_softc_list, sc, sc_list); - return (0); + return 0; } static int @@ -259,7 +268,7 @@ stf_clone_destroy(struct ifnet *ifp) rtcache_free(&sc->sc_ro); free(sc, M_DEVBUF); - return (0); + return 0; } static int Index: src/sys/net/if_tap.c diff -u src/sys/net/if_tap.c:1.99.6.1 src/sys/net/if_tap.c:1.99.6.2 --- src/sys/net/if_tap.c:1.99.6.1 Wed Nov 8 22:20:59 2017 +++ src/sys/net/if_tap.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_tap.c,v 1.99.6.1 2017/11/08 22:20:59 snj Exp $ */ +/* $NetBSD: if_tap.c,v 1.99.6.2 2017/12/10 10:10:25 snj Exp $ */ /* * Copyright (c) 2003, 2004, 2008, 2009 The NetBSD Foundation. @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.99.6.1 2017/11/08 22:20:59 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.99.6.2 2017/12/10 10:10:25 snj Exp $"); #if defined(_KERNEL_OPT) @@ -380,7 +380,17 @@ tap_attach(device_t parent, device_t sel sc->sc_ec.ec_capabilities = ETHERCAP_VLAN_MTU | ETHERCAP_JUMBO_MTU; /* Those steps are mandatory for an Ethernet driver. */ - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error_dev(self, "if_initialize failed(%d)\n", error); + ifmedia_removeall(&sc->sc_im); + pmf_device_deregister(self); + mutex_destroy(&sc->sc_rdlock); + mutex_destroy(&sc->sc_kqlock); + seldestroy(&sc->sc_rsel); + + return; /* Error */ + } ether_ifattach(ifp, enaddr); if_register(ifp); @@ -404,8 +414,8 @@ tap_attach(device_t parent, device_t sel tap_sysctl_handler, 0, (void *)sc, 18, CTL_NET, AF_LINK, tap_node, device_unit(sc->sc_dev), CTL_EOL)) != 0) - aprint_error_dev(self, "sysctl_createv returned %d, ignoring\n", - error); + aprint_error_dev(self, + "sysctl_createv returned %d, ignoring\n", error); } /* @@ -442,7 +452,7 @@ tap_detach(device_t self, int flags) "sysctl_destroyv returned %d, ignoring\n", error); ether_ifdetach(ifp); if_detach(ifp); - ifmedia_delete_instance(&sc->sc_im, IFM_INST_ANY); + ifmedia_removeall(&sc->sc_im); seldestroy(&sc->sc_rsel); mutex_destroy(&sc->sc_rdlock); mutex_destroy(&sc->sc_kqlock); Index: src/sys/net/if_vlan.c diff -u src/sys/net/if_vlan.c:1.97.2.9 src/sys/net/if_vlan.c:1.97.2.10 --- src/sys/net/if_vlan.c:1.97.2.9 Mon Nov 27 14:11:17 2017 +++ src/sys/net/if_vlan.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vlan.c,v 1.97.2.9 2017/11/27 14:11:17 martin Exp $ */ +/* $NetBSD: if_vlan.c,v 1.97.2.10 2017/12/10 10:10:25 snj Exp $ */ /*- * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. @@ -78,7 +78,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.97.2.9 2017/11/27 14:11:17 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.97.2.10 2017/12/10 10:10:25 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -317,6 +317,7 @@ vlan_clone_create(struct if_clone *ifc, struct ifvlan *ifv; struct ifnet *ifp; struct ifvlan_linkmib *mib; + int rv; ifv = malloc(sizeof(struct ifvlan), M_DEVBUF, M_WAITOK|M_ZERO); mib = kmem_zalloc(sizeof(struct ifvlan_linkmib), KM_SLEEP); @@ -343,11 +344,28 @@ vlan_clone_create(struct if_clone *ifc, ifp->if_ioctl = vlan_ioctl; IFQ_SET_READY(&ifp->if_snd); - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + aprint_error("%s: if_initialize failed(%d)\n", ifp->if_xname, + rv); + goto fail; + } + vlan_reset_linkname(ifp); if_register(ifp); + return 0; - return (0); +fail: + mutex_enter(&ifv_list.lock); + LIST_REMOVE(ifv, ifv_list); + mutex_exit(&ifv_list.lock); + + mutex_destroy(&ifv->ifv_lock); + psref_target_destroy(&ifv->ifv_mib->ifvm_psref, ifvm_psref_class); + kmem_free(ifv->ifv_mib, sizeof(struct ifvlan_linkmib)); + free(ifv, M_DEVBUF); + + return rv; } static int Index: src/sys/netinet/ip_carp.c diff -u src/sys/netinet/ip_carp.c:1.90.2.1 src/sys/netinet/ip_carp.c:1.90.2.2 --- src/sys/netinet/ip_carp.c:1.90.2.1 Thu Nov 30 15:57:37 2017 +++ src/sys/netinet/ip_carp.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_carp.c,v 1.90.2.1 2017/11/30 15:57:37 martin Exp $ */ +/* $NetBSD: ip_carp.c,v 1.90.2.2 2017/12/10 10:10:25 snj Exp $ */ /* $OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $ */ /* @@ -33,7 +33,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.90.2.1 2017/11/30 15:57:37 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.90.2.2 2017/12/10 10:10:25 snj Exp $"); /* * TODO: @@ -847,6 +847,7 @@ carp_clone_create(struct if_clone *ifc, extern int ifqmaxlen; struct carp_softc *sc; struct ifnet *ifp; + int rv; sc = malloc(sizeof(*sc), M_DEVBUF, M_NOWAIT|M_ZERO); if (!sc) @@ -880,7 +881,15 @@ carp_clone_create(struct if_clone *ifc, ifp->if_start = carp_start; IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); IFQ_SET_READY(&ifp->if_snd); - if_initialize(ifp); + rv = if_initialize(ifp); + if (rv != 0) { + callout_destroy(&sc->sc_ad_tmo); + callout_destroy(&sc->sc_md_tmo); + callout_destroy(&sc->sc_md6_tmo); + free(ifp->if_softc, M_DEVBUF); + + return rv; + } ether_ifattach(ifp, NULL); carp_set_enaddr(sc); /* Overwrite ethernet defaults */ Index: src/sys/rump/net/lib/libshmif/if_shmem.c diff -u src/sys/rump/net/lib/libshmif/if_shmem.c:1.72 src/sys/rump/net/lib/libshmif/if_shmem.c:1.72.8.1 --- src/sys/rump/net/lib/libshmif/if_shmem.c:1.72 Thu Dec 22 12:55:28 2016 +++ src/sys/rump/net/lib/libshmif/if_shmem.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_shmem.c,v 1.72 2016/12/22 12:55:28 ozaki-r Exp $ */ +/* $NetBSD: if_shmem.c,v 1.72.8.1 2017/12/10 10:10:25 snj Exp $ */ /* * Copyright (c) 2009, 2010 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.72 2016/12/22 12:55:28 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_shmem.c,v 1.72.8.1 2017/12/10 10:10:25 snj Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -187,7 +187,16 @@ allocif(int unit, struct shmif_sc **scp) mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE); cv_init(&sc->sc_cv, "shmifcv"); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error("shmif%d: if_initialize failed(%d)\n", unit, + error); + cv_destroy(&sc->sc_cv); + mutex_destroy(&sc->sc_mtx); + kmem_free(sc, sizeof(*sc)); + + return error; + } ether_ifattach(ifp, enaddr); if_register(ifp); Index: src/sys/rump/net/lib/libvirtif/if_virt.c diff -u src/sys/rump/net/lib/libvirtif/if_virt.c:1.54 src/sys/rump/net/lib/libvirtif/if_virt.c:1.54.8.1 --- src/sys/rump/net/lib/libvirtif/if_virt.c:1.54 Thu Dec 15 09:28:07 2016 +++ src/sys/rump/net/lib/libvirtif/if_virt.c Sun Dec 10 10:10:25 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_virt.c,v 1.54 2016/12/15 09:28:07 ozaki-r Exp $ */ +/* $NetBSD: if_virt.c,v 1.54.8.1 2017/12/10 10:10:25 snj Exp $ */ /* * Copyright (c) 2008, 2013 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_virt.c,v 1.54 2016/12/15 09:28:07 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_virt.c,v 1.54.8.1 2017/12/10 10:10:25 snj Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -121,7 +121,13 @@ virtif_clone(struct if_clone *ifc, int n ifp->if_mtu = ETHERMTU; ifp->if_dlt = DLT_EN10MB; - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + aprint_error("%s: if_initialize failed(%d)\n", ifp->if_xname, + error); + goto fail_1; + } + if_register(ifp); #ifndef RUMP_VIF_LINKSTR @@ -132,11 +138,19 @@ virtif_clone(struct if_clone *ifc, int n */ #define LINKSTRNUMLEN 16 sc->sc_linkstr = kmem_alloc(LINKSTRNUMLEN, KM_SLEEP); + if (sc->sc_linkstr == NULL) { + error = ENOMEM; + goto fail_2; + } snprintf(sc->sc_linkstr, LINKSTRNUMLEN, "%d", sc->sc_num); -#undef LINKSTRNUMLEN error = virtif_create(ifp); if (error) { +fail_2: if_detach(ifp); + if (sc->sc_linkstr != NULL) + kmem_free(sc->sc_linkstr, LINKSTRNUMLEN); +#undef LINKSTRNUMLEN +fail_1: kmem_free(sc, sizeof(*sc)); ifp->if_softc = NULL; }