]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Adapt the fix in r341008 to correctly work with EBR.
authorAndrey V. Elsukov <ae@FreeBSD.org>
Fri, 30 Nov 2018 10:36:14 +0000 (10:36 +0000)
committerAndrey V. Elsukov <ae@FreeBSD.org>
Fri, 30 Nov 2018 10:36:14 +0000 (10:36 +0000)
commit851073551d6c97e0a7e689bd80e32c7b722a74b4
tree2dae6a19e32b2e4d1180190b0735f4a356d43878
parentfc6ebb297bc91046d105fb77f40c6d06d5d49c7c
Adapt the fix in r341008 to correctly work with EBR.

IFNET_RLOCK_NOSLEEP() is epoch_enter_preempt() in FreeBSD 12+. Holding
it in sysctl_rtsock() doesn't protect us from ifnet unlinking, because
unlinking occurs with IFNET_WLOCK(), that is rw_wlock+sx_xlock, and it
doesn check that concurrent code is running in epoch section. But while
we are in epoch section, we should be able to do access to ifnet's
fields, even it was unlinked. Thus do not change if_addr and if_hw_addr
fields in ifnet_detach_internal() to NULL, since rtsock code can do
access to these fields and this is allowed while it is running in epoch
section.

This should fix the race, when ifnet_detach_internal() unlinks ifnet
after we checked it for IFF_DYING in sysctl_dumpentry.

Move free(ifp->if_hw_addr) into ifnet_free_internal(). Also remove the
NULL check for ifp->if_description, since free(9) can correctly handle
NULL pointer.

MFC after: 1 week
sys/net/if.c