The call into ifa_ifwithaddr() needs to be epoch protected; ortherwise
we'll panic on an assertion. While here, leave a comment that the ifp was never protected and stable (as glebius pointed out) and this needs to be fixed properly. Discovered while working on: PR 246629 Reviewed by: glebius MFC after: 4 days Sponsored by: Rubicon Communications, LLC (d/b/a "Netgate")
This commit is contained in:
parent
9a7053ce96
commit
b7b3d237e7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362288
@ -879,13 +879,19 @@ add_vif(struct vifctl *vifcp)
|
|||||||
*/
|
*/
|
||||||
ifp = NULL;
|
ifp = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
struct epoch_tracker et;
|
||||||
|
|
||||||
sin.sin_addr = vifcp->vifc_lcl_addr;
|
sin.sin_addr = vifcp->vifc_lcl_addr;
|
||||||
|
NET_EPOCH_ENTER(et);
|
||||||
ifa = ifa_ifwithaddr((struct sockaddr *)&sin);
|
ifa = ifa_ifwithaddr((struct sockaddr *)&sin);
|
||||||
if (ifa == NULL) {
|
if (ifa == NULL) {
|
||||||
|
NET_EPOCH_EXIT(et);
|
||||||
VIF_UNLOCK();
|
VIF_UNLOCK();
|
||||||
return EADDRNOTAVAIL;
|
return EADDRNOTAVAIL;
|
||||||
}
|
}
|
||||||
ifp = ifa->ifa_ifp;
|
ifp = ifa->ifa_ifp;
|
||||||
|
/* XXX FIXME we need to take a ref on ifp and cleanup properly! */
|
||||||
|
NET_EPOCH_EXIT(et);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((vifcp->vifc_flags & VIFF_TUNNEL) != 0) {
|
if ((vifcp->vifc_flags & VIFF_TUNNEL) != 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user