Module Name:    src
Committed By:   msaitoh
Date:           Mon Oct 23 09:22:51 UTC 2017

Modified Files:
        src/sys/net: if_bridge.c

Log Message:
- If if_initialize() failed in the attach function, free resources and return.
- Add some missing frees in bridge_clone_destroy().
- KNF


To generate a diff of this commit:
cvs rdiff -u -r1.135 -r1.136 src/sys/net/if_bridge.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/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.135 src/sys/net/if_bridge.c:1.136
--- src/sys/net/if_bridge.c:1.135	Mon Oct  2 07:40:24 2017
+++ src/sys/net/if_bridge.c	Mon Oct 23 09:22:51 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bridge.c,v 1.135 2017/10/02 07:40:24 ozaki-r Exp $	*/
+/*	$NetBSD: if_bridge.c,v 1.136 2017/10/23 09:22:51 msaitoh Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.135 2017/10/02 07:40:24 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.136 2017/10/23 09:22:51 msaitoh 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,13 @@ 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->sc_rthash, sizeof(*sc->sc_rthash) * BRIDGE_RTHASH_SIZE);
 	kmem_free(sc, sizeof(*sc));
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -530,7 +542,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 +630,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c
 
 	splx(s);
 
-	return (error);
+	return error;
 }
 
 /*
@@ -733,7 +745,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 +819,7 @@ bridge_ioctl_add(struct bridge_softc *sc
 		if (bif != NULL)
 			kmem_free(bif, sizeof(*bif));
 	}
-	return (error);
+	return error;
 }
 
 static int
@@ -873,7 +885,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 +895,7 @@ bridge_ioctl_gifflags(struct bridge_soft
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -895,7 +907,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 +919,7 @@ bridge_ioctl_sifflags(struct bridge_soft
 		default:
 			/* Nothing else can. */
 			bridge_release_member(sc, bif, &psref);
-			return (EINVAL);
+			return EINVAL;
 		}
 	}
 
@@ -918,7 +930,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 +941,7 @@ bridge_ioctl_scache(struct bridge_softc 
 	sc->sc_brtmax = param->ifbrp_csize;
 	bridge_rttrim(sc);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -939,7 +951,7 @@ bridge_ioctl_gcache(struct bridge_softc 
 
 	param->ifbrp_csize = sc->sc_brtmax;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1023,7 +1035,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 +1063,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 +1076,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 +1093,7 @@ bridge_ioctl_sto(struct bridge_softc *sc
 
 	sc->sc_brttimeout = param->ifbrp_ctime;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1091,7 +1103,7 @@ bridge_ioctl_gto(struct bridge_softc *sc
 
 	param->ifbrp_ctime = sc->sc_brttimeout;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1109,7 +1121,7 @@ bridge_ioctl_flush(struct bridge_softc *
 
 	bridge_rtflush(sc, req->ifbr_ifsflags);
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1119,7 +1131,7 @@ bridge_ioctl_gpri(struct bridge_softc *s
 
 	param->ifbrp_prio = sc->sc_bridge_priority;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1132,7 +1144,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 +1154,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 +1163,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 +1179,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 +1188,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 +1204,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 +1213,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 +1231,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 +1240,7 @@ bridge_ioctl_sifprio(struct bridge_softc
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (0);
+	return 0;
 }
 
 #if defined(BRIDGE_IPF)
@@ -1239,7 +1251,7 @@ bridge_ioctl_gfilt(struct bridge_softc *
 
 	param->ifbrp_filter = sc->sc_filter_flags;
 
-	return (0);
+	return 0;
 }
 
 static int
@@ -1249,7 +1261,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 +1277,7 @@ bridge_ioctl_sfilt(struct bridge_softc *
 
 	sc->sc_filter_flags = nflags;
 
-	return (0);
+	return 0;
 }
 #endif /* BRIDGE_IPF */
 
@@ -1278,7 +1290,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 +1299,7 @@ bridge_ioctl_sifcost(struct bridge_softc
 
 	bridge_release_member(sc, bif, &psref);
 
-	return (0);
+	return 0;
 }
 
 /*
@@ -1322,14 +1334,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 +1452,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 +1578,7 @@ next:
 
 		if (!used)
 			m_freem(m);
-		return (0);
+		return 0;
 	}
 
  sendunicast:
@@ -1576,12 +1588,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 +2407,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 +2441,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 +2461,7 @@ bridge_rtnode_insert(struct bridge_softc
 	LIST_INSERT_HEAD(&sc->sc_rtlist, brt, brt_list);
 	sc->sc_brtcnt++;
 
-	return (0);
+	return 0;
 }
 
 /*

Reply via email to