summaryrefslogtreecommitdiffstats
path: root/sys/net/bridgectl.c
diff options
context:
space:
mode:
authormvs <mvs@openbsd.org>2021-01-25 19:47:16 +0000
committermvs <mvs@openbsd.org>2021-01-25 19:47:16 +0000
commit044aaac6d42ec1f1777a52f2fa98b542d731d25c (patch)
tree56434ca1dd6831d94bb976bfd425c231bb38b9c3 /sys/net/bridgectl.c
parentGive machdep.c a thorough cleanup that is long overdue. (diff)
downloadwireguard-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.c37
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: