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

Reply via email to