- If if_attach() failed in the attach function, free resources and return.

- KNF
This commit is contained in:
msaitoh 2017-10-23 09:32:55 +00:00
parent 2223ce7058
commit 351c2b7262
2 changed files with 38 additions and 21 deletions

View File

@ -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.27 2017/10/23 09:32:55 msaitoh Exp $ */
/* This file is in the public domain. */ /* This file is in the public domain. */
#include <sys/cdefs.h> #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.27 2017/10/23 09:32:55 msaitoh Exp $");
#ifdef _KERNEL_OPT #ifdef _KERNEL_OPT
#include "opt_inet.h" #include "opt_inet.h"
@ -88,7 +88,7 @@ update_mtu(struct srt_softc *sc)
if (sc->flags & SSF_MTULOCK) if (sc->flags & SSF_MTULOCK)
return; return;
mtu = 65535; mtu = 65535;
for (i=sc->nrt-1;i>=0;i--) { for (i = sc->nrt-1; i>=0; i--) {
r = sc->rts[i]; r = sc->rts[i];
if (r->u.dstifp->if_mtu < mtu) if (r->u.dstifp->if_mtu < mtu)
mtu = r->u.dstifp->if_mtu; mtu = r->u.dstifp->if_mtu;
@ -249,12 +249,13 @@ static int
srt_clone_create(struct if_clone *cl, int unit) srt_clone_create(struct if_clone *cl, int unit)
{ {
struct srt_softc *sc; struct srt_softc *sc;
int rv;
if (unit < 0 || unit > SRT_MAXUNIT) if (unit < 0 || unit > SRT_MAXUNIT)
return ENXIO; return ENXIO;
if (softcv[unit]) if (softcv[unit])
return EBUSY; 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->unit = unit;
sc->nrt = 0; sc->nrt = 0;
sc->rts = 0; sc->rts = 0;
@ -268,7 +269,13 @@ srt_clone_create(struct if_clone *cl, int unit)
sc->intf.if_ioctl = &srt_if_ioctl; sc->intf.if_ioctl = &srt_if_ioctl;
sc->intf.if_output = &srt_if_output; sc->intf.if_output = &srt_if_output;
sc->intf.if_dlt = DLT_RAW; 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); if_alloc_sadl(&sc->intf);
#ifdef BPFILTER_NOW_AVAILABLE #ifdef BPFILTER_NOW_AVAILABLE
bpf_attach(&sc->intf, 0, 0); bpf_attach(&sc->intf, 0, 0);
@ -295,16 +302,16 @@ srt_clone_destroy(struct ifnet *ifp)
} }
if (softcv[sc->unit] != sc) { if (softcv[sc->unit] != sc) {
panic("srt_clone_destroy: bad backpointer ([%d]=%p not %p)\n", 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; softcv[sc->unit] = 0;
free(sc,M_DEVBUF); free(sc, M_DEVBUF);
atomic_inc_uint(&srt_count); atomic_inc_uint(&srt_count);
return 0; return 0;
} }
struct if_clone srt_clone = 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 void
srtattach(int n) srtattach(int n)
@ -408,8 +415,9 @@ srt_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
dr->af = scr->af; dr->af = scr->af;
dr->srcmatch = scr->srcmatch; dr->srcmatch = scr->srcmatch;
dr->srcmask = scr->srcmask; dr->srcmask = scr->srcmask;
strlcpy(&dr->u.dstifn[0],&scr->u.dstifp->if_xname[0],IFNAMSIZ); strlcpy(&dr->u.dstifn[0], &scr->u.dstifp->if_xname[0],
memcpy(&dr->dst,&scr->dst,scr->dst.sa.sa_len); IFNAMSIZ);
memcpy(&dr->dst, &scr->dst, scr->dst.sa.sa_len);
return 0; return 0;
case SRT_SETRT: case SRT_SETRT:
if (! (flag & FWRITE)) if (! (flag & FWRITE))
@ -417,7 +425,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
dr = (struct srt_rt *) data; dr = (struct srt_rt *) data;
if (dr->inx > sc->nrt) if (dr->inx > sc->nrt)
return EDOM; return EDOM;
strlcpy(&nbuf[0],&dr->u.dstifn[0],IFNAMSIZ); strlcpy(&nbuf[0], &dr->u.dstifn[0], IFNAMSIZ);
nbuf[IFNAMSIZ-1] = '\0'; nbuf[IFNAMSIZ-1] = '\0';
if (dr->dst.sa.sa_family != dr->af) if (dr->dst.sa.sa_family != dr->af)
return EIO; return EIO;
@ -460,7 +468,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
} }
scr = sc->rts[dr->inx]; scr = sc->rts[dr->inx];
if (scr == 0) { 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) if (scr == 0)
return ENOBUFS; return ENOBUFS;
scr->inx = dr->inx; scr->inx = dr->inx;
@ -488,7 +496,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
sc->nrt--; sc->nrt--;
if (i < sc->nrt) { if (i < sc->nrt) {
memcpy(sc->rts+i, sc->rts+i+1, memcpy(sc->rts+i, sc->rts+i+1,
(sc->nrt-i)*sizeof(*sc->rts)); (sc->nrt-i) * sizeof(*sc->rts));
} }
if (sc->nrt == 0) { if (sc->nrt == 0) {
free(sc->rts, M_DEVBUF); free(sc->rts, M_DEVBUF);
@ -510,7 +518,7 @@ srt_ioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
*(unsigned int *)data = sc->flags | global_flags; *(unsigned int *)data = sc->flags | global_flags;
return 0; return 0;
case SRT_SGFLAGS: case SRT_SGFLAGS:
if ((flag & (FWRITE|FREAD)) != (FWRITE|FREAD)) if ((flag & (FWRITE | FREAD)) != (FWRITE | FREAD))
return EBADF; return EBADF;
o = sc->flags | global_flags; o = sc->flags | global_flags;
n = *(unsigned int *)data & SSF_UCHG; n = *(unsigned int *)data & SSF_UCHG;

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_stf.c,v 1.101 2016/12/12 03:55:57 ozaki-r Exp $ */ /* $NetBSD: if_stf.c,v 1.102 2017/10/23 09:32:55 msaitoh Exp $ */
/* $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */ /* $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */
/* /*
@ -75,7 +75,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.101 2016/12/12 03:55:57 ozaki-r Exp $"); __KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.102 2017/10/23 09:32:55 msaitoh Exp $");
#ifdef _KERNEL_OPT #ifdef _KERNEL_OPT
#include "opt_inet.h" #include "opt_inet.h"
@ -220,7 +220,7 @@ stf_clone_create(struct if_clone *ifc, int unit)
/* Only one stf interface is allowed. */ /* Only one stf interface is allowed. */
encap_lock_exit(); encap_lock_exit();
free(sc, M_DEVBUF); free(sc, M_DEVBUF);
return (EEXIST); return EEXIST;
} }
sc->encap_cookie = encap_attach_func(AF_INET, IPPROTO_IPV6, sc->encap_cookie = encap_attach_func(AF_INET, IPPROTO_IPV6,
@ -229,7 +229,7 @@ stf_clone_create(struct if_clone *ifc, int unit)
if (sc->encap_cookie == NULL) { if (sc->encap_cookie == NULL) {
printf("%s: unable to attach encap\n", if_name(&sc->sc_if)); printf("%s: unable to attach encap\n", if_name(&sc->sc_if));
free(sc, M_DEVBUF); free(sc, M_DEVBUF);
return (EIO); /* XXX */ return EIO; /* XXX */
} }
sc->sc_if.if_mtu = STF_MTU; sc->sc_if.if_mtu = STF_MTU;
@ -238,11 +238,20 @@ stf_clone_create(struct if_clone *ifc, int unit)
sc->sc_if.if_output = stf_output; sc->sc_if.if_output = stf_output;
sc->sc_if.if_type = IFT_STF; sc->sc_if.if_type = IFT_STF;
sc->sc_if.if_dlt = DLT_NULL; 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); if_alloc_sadl(&sc->sc_if);
bpf_attach(&sc->sc_if, DLT_NULL, sizeof(u_int)); bpf_attach(&sc->sc_if, DLT_NULL, sizeof(u_int));
LIST_INSERT_HEAD(&stf_softc_list, sc, sc_list); LIST_INSERT_HEAD(&stf_softc_list, sc, sc_list);
return (0); return 0;
} }
static int static int
@ -259,7 +268,7 @@ stf_clone_destroy(struct ifnet *ifp)
rtcache_free(&sc->sc_ro); rtcache_free(&sc->sc_ro);
free(sc, M_DEVBUF); free(sc, M_DEVBUF);
return (0); return 0;
} }
static int static int