diff options
Diffstat (limited to 'sys/net/if.c')
| -rw-r--r-- | sys/net/if.c | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 00d81d94894..0a985222d8d 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.527 2017/11/14 04:08:11 dlg Exp $ */ +/* $OpenBSD: if.c,v 1.528 2017/11/14 16:01:55 tb Exp $ */ /* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */ /* @@ -1810,16 +1810,26 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) switch (cmd) { case SIOCIFCREATE: + if ((error = suser(p, 0)) != 0) + return (error); + NET_LOCK(); + error = if_clone_create(ifr->ifr_name, 0); + NET_UNLOCK(); + return (error); case SIOCIFDESTROY: if ((error = suser(p, 0)) != 0) return (error); - return ((cmd == SIOCIFCREATE) ? - if_clone_create(ifr->ifr_name, 0) : - if_clone_destroy(ifr->ifr_name)); + NET_LOCK(); + error = if_clone_destroy(ifr->ifr_name); + NET_UNLOCK(); + return (error); case SIOCSIFGATTR: if ((error = suser(p, 0)) != 0) return (error); - return (if_setgroupattribs(data)); + NET_LOCK(); + error = if_setgroupattribs(data); + NET_UNLOCK(); + return (error); case SIOCGIFCONF: case SIOCIFGCLONERS: case SIOCGIFGMEMB: @@ -1845,6 +1855,8 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) oif_flags = ifp->if_flags; oif_xflags = ifp->if_xflags; + NET_LOCK(); + switch (cmd) { case SIOCIFAFATTACH: case SIOCIFAFDETACH: @@ -2093,6 +2105,8 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) if (((oif_flags ^ ifp->if_flags) & IFF_UP) != 0) getmicrotime(&ifp->if_lastchange); + NET_UNLOCK(); + return (error); } @@ -2109,19 +2123,33 @@ ifioctl_get(u_long cmd, caddr_t data) switch(cmd) { case SIOCGIFCONF: - return (ifconf(data)); + NET_RLOCK(); + error = ifconf(data); + NET_RUNLOCK(); + return (error); case SIOCIFGCLONERS: - return (if_clone_list((struct if_clonereq *)data)); + NET_RLOCK(); + error = if_clone_list((struct if_clonereq *)data); + NET_RUNLOCK(); + return (error); case SIOCGIFGMEMB: - return (if_getgroupmembers(data)); + NET_RLOCK(); + error = if_getgroupmembers(data); + NET_RUNLOCK(); + return (error); case SIOCGIFGATTR: - return (if_getgroupattribs(data)); + NET_RLOCK(); + error = if_getgroupattribs(data); + NET_RUNLOCK(); + return (error); } ifp = ifunit(ifr->ifr_name); if (ifp == NULL) return (ENXIO); + NET_RLOCK(); + switch(cmd) { case SIOCGIFFLAGS: ifr->ifr_flags = ifp->if_flags; @@ -2188,6 +2216,8 @@ ifioctl_get(u_long cmd, caddr_t data) panic("invalid ioctl %lu", cmd); } + NET_RUNLOCK(); + return (error); } |
