diff options
author | 2021-01-25 19:47:16 +0000 | |
---|---|---|
committer | 2021-01-25 19:47:16 +0000 | |
commit | 044aaac6d42ec1f1777a52f2fa98b542d731d25c (patch) | |
tree | 56434ca1dd6831d94bb976bfd425c231bb38b9c3 /sys/net/bridgectl.c | |
parent | Give machdep.c a thorough cleanup that is long overdue. (diff) | |
download | wireguard-openbsd-044aaac6d42ec1f1777a52f2fa98b542d731d25c.tar.xz wireguard-openbsd-044aaac6d42ec1f1777a52f2fa98b542d731d25c.zip |
We have this sequence in bridge(4) ioctl(2) path:
ifs = ifunit(req->ifbr_ifsname);
if (ifs == NULL) {
error = ENOENT;
break;
}
if (ifs->if_bridgeidx != ifp->if_index) {
error = ESRCH;
break;
}
bif = bridge_getbif(ifs);
This sequence repeats 8 times. Also we don't check value returned by
bridge_getbig() before use. Newly introduced bridge_getbig() function
replaces this sequence. This not only reduces duplicated code but also
makes `bif' dereference safe.
ok bluhm@
Diffstat (limited to 'sys/net/bridgectl.c')
-rw-r--r-- | sys/net/bridgectl.c | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/sys/net/bridgectl.c b/sys/net/bridgectl.c index 491770f9543..6af65b1aeb7 100644 --- a/sys/net/bridgectl.c +++ b/sys/net/bridgectl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bridgectl.c,v 1.21 2020/06/24 22:03:42 cheloha Exp $ */ +/* $OpenBSD: bridgectl.c,v 1.22 2021/01/25 19:47:16 mvs Exp $ */ /* * Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net) @@ -120,22 +120,15 @@ bridgectl_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) bparam->ifbrp_ctime = sc->sc_brttimeout; break; case SIOCBRDGARL: - ifs = ifunit(brlreq->ifbr_ifsname); - if (ifs == NULL) { - error = ENOENT; - break; - } - if (ifs->if_bridgeidx != ifp->if_index) { - error = ESRCH; - break; - } if ((brlreq->ifbr_action != BRL_ACTION_BLOCK && brlreq->ifbr_action != BRL_ACTION_PASS) || (brlreq->ifbr_flags & (BRL_FLAG_IN|BRL_FLAG_OUT)) == 0) { error = EINVAL; break; } - bif = bridge_getbif(ifs); + error = bridge_findbif(sc, brlreq->ifbr_ifsname, &bif); + if (error != 0) + break; if (brlreq->ifbr_flags & BRL_FLAG_IN) { error = bridge_addrule(bif, brlreq, 0); if (error) @@ -148,29 +141,15 @@ bridgectl_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } break; case SIOCBRDGFRL: - ifs = ifunit(brlreq->ifbr_ifsname); - if (ifs == NULL) { - error = ENOENT; - break; - } - if (ifs->if_bridgeidx != ifp->if_index) { - error = ESRCH; + error = bridge_findbif(sc, brlreq->ifbr_ifsname, &bif); + if (error != 0) break; - } - bif = bridge_getbif(ifs); bridge_flushrule(bif); break; case SIOCBRDGGRL: - ifs = ifunit(bc->ifbrl_ifsname); - if (ifs == NULL) { - error = ENOENT; + error = bridge_findbif(sc, bc->ifbrl_ifsname, &bif); + if (error != 0) break; - } - if (ifs->if_bridgeidx != ifp->if_index) { - error = ESRCH; - break; - } - bif = bridge_getbif(ifs); error = bridge_brlconf(bif, bc); break; default: |