svn commit: r271842 - stable/9/sys/netinet
Alan Somers
asomers at FreeBSD.org
Thu Sep 18 22:12:52 UTC 2014
Author: asomers
Date: Thu Sep 18 22:12:52 2014
New Revision: 271842
URL: http://svnweb.freebsd.org/changeset/base/271842
Log:
MFC r265092, except for the ATF bits.
Fix a panic when removing an IP address from an interface, if the same address
exists on another interface. The panic was introduced by change 264887, which
changed the fibnum parameter in the call to rtalloc1_fib() in
ifa_switch_loopback_route() from RT_DEFAULT_FIB to RT_ALL_FIBS. The solution
is to use the interface fib in that call. For the majority of users, that will
be equivalent to the legacy behavior.
PR: kern/189089
Modified:
stable/9/sys/netinet/in.c
Directory Properties:
stable/9/ (props changed)
stable/9/sys/ (props changed)
Modified: stable/9/sys/netinet/in.c
==============================================================================
--- stable/9/sys/netinet/in.c Thu Sep 18 22:10:49 2014 (r271841)
+++ stable/9/sys/netinet/in.c Thu Sep 18 22:12:52 2014 (r271842)
@@ -1051,11 +1051,9 @@ in_scrubprefix(struct in_ifaddr *target,
{
struct in_ifaddr *ia;
struct in_addr prefix, mask, p;
- int error = 0, fibnum;
+ int error = 0;
struct sockaddr_in prefix0, mask0;
- fibnum = rt_add_addr_allfibs ? RT_ALL_FIBS : target->ia_ifp->if_fib;
-
/*
* Remove the loopback route to the interface address.
* The "useloopback" setting is not consulted because if the
@@ -1071,9 +1069,11 @@ in_scrubprefix(struct in_ifaddr *target,
(target->ia_flags & IFA_RTSELF)) {
struct route ia_ro;
int freeit = 0;
+ int fibnum;
bzero(&ia_ro, sizeof(ia_ro));
*((struct sockaddr_in *)(&ia_ro.ro_dst)) = target->ia_addr;
+ fibnum = target->ia_ifp->if_fib;
rtalloc_ign_fib(&ia_ro, 0, fibnum);
if ((ia_ro.ro_rt != NULL) && (ia_ro.ro_rt->rt_ifp != NULL) &&
(ia_ro.ro_rt->rt_ifp == V_loif)) {
@@ -1107,6 +1107,10 @@ in_scrubprefix(struct in_ifaddr *target,
}
if ((target->ia_flags & IFA_ROUTE) == 0) {
+ int fibnum;
+
+ fibnum = rt_add_addr_allfibs ? RT_ALL_FIBS :
+ target->ia_ifp->if_fib;
rt_addrmsg(RTM_DELETE, &target->ia_ifa, fibnum);
return (0);
}
More information about the svn-src-stable-9
mailing list