This was in fact in_ioctl_get().
---
Push kernel lock into nd6_ioctl()
Purely mechanical.
Feedback? OK?
---
sys/netinet6/in6.c | 2 --
sys/netinet6/nd6.c | 5 +++++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 65f4b44e700..3c5b47bc1ed 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -231,9 +231,7 @@ in6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int
privileged)
switch (cmd) {
case SIOCGIFINFO_IN6:
case SIOCGNBRINFO_IN6:
- KERNEL_LOCK();
error = nd6_ioctl(cmd, data, ifp);
- KERNEL_UNLOCK();
return (error);
case SIOCGIFDSTADDR_IN6:
case SIOCGIFNETMASK_IN6:
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index d88969be617..716946ab831 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -1018,9 +1018,11 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
switch (cmd) {
case SIOCGIFINFO_IN6:
+ KERNEL_LOCK();
NET_LOCK_SHARED();
ndi->ndi = *ND_IFINFO(ifp);
NET_UNLOCK_SHARED();
+ KERNEL_UNLOCK();
return (0);
case SIOCGNBRINFO_IN6:
{
@@ -1028,6 +1030,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
struct in6_addr nb_addr = nbi->addr; /* make local for safety */
time_t expire;
+ KERNEL_LOCK();
NET_LOCK_SHARED();
/*
* XXX: KAME specific hack for scoped addresses
@@ -1046,6 +1049,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
(ln = (struct llinfo_nd6 *)rt->rt_llinfo) == NULL) {
rtfree(rt);
NET_UNLOCK_SHARED();
+ KERNEL_UNLOCK();
return (EINVAL);
}
expire = ln->ln_rt->rt_expire;
@@ -1061,6 +1065,7 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
rtfree(rt);
NET_UNLOCK_SHARED();
+ KERNEL_UNLOCK();
return (0);
}
}
--
2.38.1