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
56ac38d0cd
commit
3f6e482637
@ -879,13 +879,19 @@ add_vif(struct vifctl *vifcp)
|
||||
*/
|
||||
ifp = NULL;
|
||||
} else {
|
||||
struct epoch_tracker et;
|
||||
|
||||
sin.sin_addr = vifcp->vifc_lcl_addr;
|
||||
NET_EPOCH_ENTER(et);
|
||||
ifa = ifa_ifwithaddr((struct sockaddr *)&sin);
|
||||
if (ifa == NULL) {
|
||||
NET_EPOCH_EXIT(et);
|
||||
VIF_UNLOCK();
|
||||
return EADDRNOTAVAIL;
|
||||
}
|
||||
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) {
|
||||
|
Loading…
Reference in New Issue
Block a user