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; } /*