diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 407764ed263..64842dbb8cb 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -1566,12 +1566,14 @@ sysctl_dumpentry(struct radix_node *rn, void *vw) info.rti_info[RTAX_NETMASK] = rtsock_fix_netmask(rt_key(rt), rt_mask(rt), &ss); info.rti_info[RTAX_GENMASK] = 0; - if (rt->rt_ifp) { + IF_ADDR_RLOCK(rt->rt_ifp); + if (rt->rt_ifp && !(rt->rt_ifp->if_flags & IFF_DYING)) { info.rti_info[RTAX_IFP] = rt->rt_ifp->if_addr->ifa_addr; info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr; if (rt->rt_ifp->if_flags & IFF_POINTOPOINT) info.rti_info[RTAX_BRD] = rt->rt_ifa->ifa_dstaddr; } + IF_ADDR_RUNLOCK(rt->rt_ifp); if ((error = rtsock_msg_buffer(RTM_GET, &info, w, &size)) != 0) return (error); if (w->w_req && w->w_tmem) { @@ -1921,9 +1923,11 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS) for (error = 0; error == 0 && i <= lim; i++) { rnh = rt_tables_get_rnh(fib, i); if (rnh != NULL) { - RIB_RLOCK(rnh); - error = rnh->rnh_walktree(&rnh->head, + RIB_RLOCK(rnh); + NET_EPOCH_ENTER(); + error = rnh->rnh_walktree(&rnh->head, sysctl_dumpentry, &w); + NET_EPOCH_EXIT(); RIB_RUNLOCK(rnh); } else if (af != 0) error = EAFNOSUPPORT;