in6_ifattach_linklocal: handle immediate removal of the new LLA

If another thread immediately removes the link-local address
added by in6_update_ifa(), in6ifa_ifpforlinklocal() can return NULL,
so the following assertion (or dereference) is wrong.
Remove the assertion, and handle NULL somewhat better than panicking.
This matches all of the other callers of in6_update_ifa().

PR:		219250
Reviewed by:	bz, dab (both an earlier version)
MFC after:	1 week
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D17898
This commit is contained in:
Eric van Gyzen 2018-11-08 19:50:23 +00:00
parent 37761e2eda
commit 68b840878c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=340257

View File

@ -481,9 +481,16 @@ in6_ifattach_linklocal(struct ifnet *ifp, struct ifnet *altifp)
return (-1);
}
ia = in6ifa_ifpforlinklocal(ifp, 0); /* ia must not be NULL */
KASSERT(ia != NULL, ("%s: ia == NULL, ifp=%p", __func__, ifp));
ia = in6ifa_ifpforlinklocal(ifp, 0);
if (ia == NULL) {
/*
* Another thread removed the address that we just added.
* This should be rare, but it happens.
*/
nd6log((LOG_NOTICE, "%s: %s: new link-local address "
"disappeared\n", __func__, if_name(ifp)));
return (-1);
}
ifa_free(&ia->ia_ifa);
/*