Module Name: src Committed By: msaitoh Date: Mon Oct 23 09:31:18 UTC 2017
Modified Files: src/sys/arch/usermode/dev: if_veth.c src/sys/dev/ic: bwfm.c malo.c rt2560.c rt2661.c rt2860.c rtw.c rtwvar.h wi.c src/sys/dev/pci: if_ipw.c if_iwn.c if_rtwn.c if_wpi.c src/sys/dev/pci/ixgbe: ixgbe.c ixv.c src/sys/dev/scsipi: if_se.c src/sys/net: if_etherip.c if_gif.c if_vlan.c src/sys/netinet: ip_carp.c src/sys/rump/net/lib/libshmif: if_shmem.c Log Message: If if_initialize() failed in the attach function, free resources and return. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/usermode/dev/if_veth.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/bwfm.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/ic/malo.c cvs rdiff -u -r1.30 -r1.31 src/sys/dev/ic/rt2560.c cvs rdiff -u -r1.35 -r1.36 src/sys/dev/ic/rt2661.c cvs rdiff -u -r1.28 -r1.29 src/sys/dev/ic/rt2860.c cvs rdiff -u -r1.126 -r1.127 src/sys/dev/ic/rtw.c cvs rdiff -u -r1.45 -r1.46 src/sys/dev/ic/rtwvar.h cvs rdiff -u -r1.243 -r1.244 src/sys/dev/ic/wi.c cvs rdiff -u -r1.65 -r1.66 src/sys/dev/pci/if_ipw.c cvs rdiff -u -r1.85 -r1.86 src/sys/dev/pci/if_iwn.c cvs rdiff -u -r1.12 -r1.13 src/sys/dev/pci/if_rtwn.c cvs rdiff -u -r1.78 -r1.79 src/sys/dev/pci/if_wpi.c cvs rdiff -u -r1.105 -r1.106 src/sys/dev/pci/ixgbe/ixgbe.c cvs rdiff -u -r1.72 -r1.73 src/sys/dev/pci/ixgbe/ixv.c cvs rdiff -u -r1.94 -r1.95 src/sys/dev/scsipi/if_se.c cvs rdiff -u -r1.38 -r1.39 src/sys/net/if_etherip.c cvs rdiff -u -r1.130 -r1.131 src/sys/net/if_gif.c cvs rdiff -u -r1.104 -r1.105 src/sys/net/if_vlan.c cvs rdiff -u -r1.90 -r1.91 src/sys/netinet/ip_carp.c cvs rdiff -u -r1.72 -r1.73 src/sys/rump/net/lib/libshmif/if_shmem.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/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.9 --- 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 Mon Oct 23 09:31:17 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.9 2017/10/23 09:31:17 msaitoh 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.9 2017/10/23 09:31:17 msaitoh 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/bwfm.c diff -u src/sys/dev/ic/bwfm.c:1.2 src/sys/dev/ic/bwfm.c:1.3 --- src/sys/dev/ic/bwfm.c:1.2 Fri Oct 20 23:38:21 2017 +++ src/sys/dev/ic/bwfm.c Mon Oct 23 09:31:17 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: bwfm.c,v 1.2 2017/10/20 23:38:21 jmcneill Exp $ */ +/* $NetBSD: bwfm.c,v 1.3 2017/10/23 09:31:17 msaitoh Exp $ */ /* $OpenBSD: bwfm.c,v 1.5 2017/10/16 22:27:16 patrick Exp $ */ /* * Copyright (c) 2010-2016 Broadcom Corporation @@ -232,7 +232,15 @@ bwfm_attach(struct bwfm_softc *sc) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ); - if_initialize(ifp); + error = if_initialize(ifp); + if (error != 0) { + printf("%s: if_initialize failed(%d)\n", DEVNAME(sc), error); + pcq_destroy(sc->sc_freetask); + workqueue_destroy(sc->sc_taskq); + + return; /* Error */ + } + ieee80211_ifattach(ic); ifp->if_percpuq = if_percpuq_create(ifp); if_deferred_start_init(ifp, NULL); Index: src/sys/dev/ic/malo.c diff -u src/sys/dev/ic/malo.c:1.9 src/sys/dev/ic/malo.c:1.10 --- src/sys/dev/ic/malo.c:1.9 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/ic/malo.c Mon Oct 23 09:31:17 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: malo.c,v 1.9 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: malo.c,v 1.10 2017/10/23 09:31:17 msaitoh 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.10 2017/10/23 09:31:17 msaitoh 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.31 --- src/sys/dev/ic/rt2560.c:1.30 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/rt2560.c Mon Oct 23 09:31:17 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.31 2017/10/23 09:31:17 msaitoh 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.31 2017/10/23 09:31:17 msaitoh 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.36 --- src/sys/dev/ic/rt2661.c:1.35 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/rt2661.c Mon Oct 23 09:31:17 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.36 2017/10/23 09:31:17 msaitoh 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.36 2017/10/23 09:31:17 msaitoh 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.28 src/sys/dev/ic/rt2860.c:1.29 --- src/sys/dev/ic/rt2860.c:1.28 Tue Jul 25 23:17:20 2017 +++ src/sys/dev/ic/rt2860.c Mon Oct 23 09:31:17 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rt2860.c,v 1.28 2017/07/25 23:17:20 maya Exp $ */ +/* $NetBSD: rt2860.c,v 1.29 2017/10/23 09:31:17 msaitoh 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.28 2017/07/25 23:17:20 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.29 2017/10/23 09:31:17 msaitoh 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.127 --- src/sys/dev/ic/rtw.c:1.126 Tue May 23 02:19:14 2017 +++ src/sys/dev/ic/rtw.c Mon Oct 23 09:31:17 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.127 2017/10/23 09:31:17 msaitoh 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.127 2017/10/23 09:31:17 msaitoh 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.46 --- src/sys/dev/ic/rtwvar.h:1.45 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/ic/rtwvar.h Mon Oct 23 09:31:17 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rtwvar.h,v 1.45 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: rtwvar.h,v 1.46 2017/10/23 09:31:17 msaitoh 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/wi.c diff -u src/sys/dev/ic/wi.c:1.243 src/sys/dev/ic/wi.c:1.244 --- src/sys/dev/ic/wi.c:1.243 Wed Mar 29 09:04:35 2017 +++ src/sys/dev/ic/wi.c Mon Oct 23 09:31:17 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: wi.c,v 1.243 2017/03/29 09:04:35 msaitoh Exp $ */ +/* $NetBSD: wi.c,v 1.244 2017/10/23 09:31:17 msaitoh 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.244 2017/10/23 09:31:17 msaitoh 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.65 src/sys/dev/pci/if_ipw.c:1.66 --- src/sys/dev/pci/if_ipw.c:1.65 Sat Jul 29 01:54:56 2017 +++ src/sys/dev/pci/if_ipw.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ipw.c,v 1.65 2017/07/29 01:54:56 riastradh Exp $ */ +/* $NetBSD: if_ipw.c,v 1.66 2017/10/23 09:31:18 msaitoh 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.65 2017/07/29 01:54:56 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ipw.c,v 1.66 2017/10/23 09:31:18 msaitoh 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_iwn.c diff -u src/sys/dev/pci/if_iwn.c:1.85 src/sys/dev/pci/if_iwn.c:1.86 --- src/sys/dev/pci/if_iwn.c:1.85 Wed Jul 19 16:55:12 2017 +++ src/sys/dev/pci/if_iwn.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwn.c,v 1.85 2017/07/19 16:55:12 mlelstv Exp $ */ +/* $NetBSD: if_iwn.c,v 1.86 2017/10/23 09:31:18 msaitoh 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.85 2017/07/19 16:55:12 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.86 2017/10/23 09:31:18 msaitoh 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.13 --- src/sys/dev/pci/if_rtwn.c:1.12 Thu May 18 01:32:46 2017 +++ src/sys/dev/pci/if_rtwn.c Mon Oct 23 09:31:18 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.13 2017/10/23 09:31:18 msaitoh 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.13 2017/10/23 09:31:18 msaitoh 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_wpi.c diff -u src/sys/dev/pci/if_wpi.c:1.78 src/sys/dev/pci/if_wpi.c:1.79 --- src/sys/dev/pci/if_wpi.c:1.78 Tue May 23 02:19:14 2017 +++ src/sys/dev/pci/if_wpi.c Mon Oct 23 09:31:18 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.79 2017/10/23 09:31:18 msaitoh 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.79 2017/10/23 09:31:18 msaitoh 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.105 src/sys/dev/pci/ixgbe/ixgbe.c:1.106 --- src/sys/dev/pci/ixgbe/ixgbe.c:1.105 Wed Oct 18 10:43:32 2017 +++ src/sys/dev/pci/ixgbe/ixgbe.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe.c,v 1.105 2017/10/18 10:43:32 msaitoh Exp $ */ +/* $NetBSD: ixgbe.c,v 1.106 2017/10/23 09:31:18 msaitoh Exp $ */ /****************************************************************************** @@ -1193,6 +1193,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"); @@ -1227,7 +1228,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.72 src/sys/dev/pci/ixgbe/ixv.c:1.73 --- src/sys/dev/pci/ixgbe/ixv.c:1.72 Wed Oct 18 10:43:32 2017 +++ src/sys/dev/pci/ixgbe/ixv.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/*$NetBSD: ixv.c,v 1.72 2017/10/18 10:43:32 msaitoh Exp $*/ +/*$NetBSD: ixv.c,v 1.73 2017/10/23 09:31:18 msaitoh Exp $*/ /****************************************************************************** @@ -102,7 +102,7 @@ static int ixv_configure_interrupts 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 int ixv_negotiate_api(struct adapter *); static void ixv_initialize_transmit_units(struct adapter *); @@ -497,7 +497,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; + } error = ixv_allocate_msix(adapter, pa); if (error) { @@ -1370,11 +1374,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"); @@ -1403,7 +1408,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); /* @@ -1449,7 +1458,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; } /* ixv_setup_interface */ 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.95 --- src/sys/dev/scsipi/if_se.c:1.94 Thu Dec 15 09:28:06 2016 +++ src/sys/dev/scsipi/if_se.c Mon Oct 23 09:31:18 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.95 2017/10/23 09:31:18 msaitoh 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.95 2017/10/23 09:31:18 msaitoh 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/net/if_etherip.c diff -u src/sys/net/if_etherip.c:1.38 src/sys/net/if_etherip.c:1.39 --- src/sys/net/if_etherip.c:1.38 Mon Jul 11 11:31:51 2016 +++ src/sys/net/if_etherip.c Mon Oct 23 09:31:18 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.39 2017/10/23 09:31:18 msaitoh 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.39 2017/10/23 09:31:18 msaitoh 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_gif.c diff -u src/sys/net/if_gif.c:1.130 src/sys/net/if_gif.c:1.131 --- src/sys/net/if_gif.c:1.130 Thu Sep 21 09:46:14 2017 +++ src/sys/net/if_gif.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gif.c,v 1.130 2017/09/21 09:46:14 knakahara Exp $ */ +/* $NetBSD: if_gif.c,v 1.131 2017/10/23 09:31:18 msaitoh 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.130 2017/09/21 09:46:14 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.131 2017/10/23 09:31:18 msaitoh 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_vlan.c diff -u src/sys/net/if_vlan.c:1.104 src/sys/net/if_vlan.c:1.105 --- src/sys/net/if_vlan.c:1.104 Thu Oct 19 07:02:00 2017 +++ src/sys/net/if_vlan.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_vlan.c,v 1.104 2017/10/19 07:02:00 knakahara Exp $ */ +/* $NetBSD: if_vlan.c,v 1.105 2017/10/23 09:31:18 msaitoh 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.104 2017/10/19 07:02:00 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.105 2017/10/23 09:31:18 msaitoh 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 src/sys/netinet/ip_carp.c:1.91 --- src/sys/netinet/ip_carp.c:1.90 Fri May 19 08:53:51 2017 +++ src/sys/netinet/ip_carp.c Mon Oct 23 09:31:18 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_carp.c,v 1.90 2017/05/19 08:53:51 ozaki-r Exp $ */ +/* $NetBSD: ip_carp.c,v 1.91 2017/10/23 09:31:18 msaitoh 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 2017/05/19 08:53:51 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.91 2017/10/23 09:31:18 msaitoh Exp $"); /* * TODO: @@ -832,6 +832,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) @@ -865,7 +866,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.73 --- 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 Mon Oct 23 09:31:18 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.73 2017/10/23 09:31:18 msaitoh 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.73 2017/10/23 09:31:18 msaitoh Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -187,7 +187,15 @@ 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, rv); + cv_destroy(&sc->sc_cv); + mutex_destroy(&sc->sc_mtx); + kmem_free(sc, sizeof(*sc)); + + return error; + } ether_ifattach(ifp, enaddr); if_register(ifp);