From 0d50e8a2eab0390cec5bad19a97db33c8ce19e04 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Tue, 11 Jul 2017 10:03:57 +0800 Subject: [PATCH] ifnet: Delete INET address should not fail; panic upon failure. This helps catch the root cause of a tun(4) related crash. Reported-by: dillon --- sys/net/if.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/sys/net/if.c b/sys/net/if.c index 8efbbfa532..b22358454e 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -772,6 +772,7 @@ if_purgeaddrs_nolink_dispatch(netmsg_t nmsg) /* XXX: Ugly!! ad hoc just for INET */ if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) { struct ifaliasreq ifr; + struct sockaddr_in saved_addr, saved_dst; #ifdef IFADDR_DEBUG_VERBOSE int i; @@ -781,6 +782,15 @@ if_purgeaddrs_nolink_dispatch(netmsg_t nmsg) kprintf("\n"); #endif + /* Save information for panic. */ + memcpy(&saved_addr, ifa->ifa_addr, sizeof(saved_addr)); + if (ifa->ifa_dstaddr != NULL) { + memcpy(&saved_dst, ifa->ifa_dstaddr, + sizeof(saved_dst)); + } else { + memset(&saved_dst, 0, sizeof(saved_dst)); + } + bzero(&ifr, sizeof ifr); ifr.ifra_addr = *ifa->ifa_addr; if (ifa->ifa_dstaddr) @@ -788,6 +798,11 @@ if_purgeaddrs_nolink_dispatch(netmsg_t nmsg) if (in_control(SIOCDIFADDR, (caddr_t)&ifr, ifp, NULL) == 0) continue; + + /* MUST NOT HAPPEN */ + panic("%s: in_control failed %x, dst %x", ifp->if_xname, + ntohl(saved_addr.sin_addr.s_addr), + ntohl(saved_dst.sin_addr.s_addr)); } #endif /* INET */ #ifdef INET6 -- 2.11.4.GIT