summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorandre <andre@FreeBSD.org>2004-10-19 22:08:13 +0000
committerandre <andre@FreeBSD.org>2004-10-19 22:08:13 +0000
commit952f79699990e2a72bc72acf195a21d4170d63b1 (patch)
treef9cacbc5c25d2fd75d2776699bf496dc40195ff9 /sys/netinet
parent009582eb77dda55209d02e40d2b836050bda1e17 (diff)
downloadFreeBSD-src-952f79699990e2a72bc72acf195a21d4170d63b1.zip
FreeBSD-src-952f79699990e2a72bc72acf195a21d4170d63b1.tar.gz
Slightly extend the locking during unload to fully cover the protocol
deregistration. This does not entirely close the race but narrows the even previously extremely small chance of a race some more.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/ip_divert.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index b2161cf..01ade1a 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -694,19 +694,20 @@ div_modevent(module_t mod, int type, void *unused)
* connected. Maybe this can be changed later to forcefully
* disconnect any open sockets.
*
- * XXXRW: Note that there is a slight race here, as a socket
- * could be opened between when we test and when we
- * unregister.
+ * XXXRW: Note that there is a slight race here, as a new
+ * socket open request could be spinning on the lock and then
+ * we destroy the lock.
*/
- INP_INFO_RLOCK(&divcbinfo);
+ INP_INFO_WLOCK(&divcbinfo);
n = divcbinfo.ipi_count;
- INP_INFO_RUNLOCK(&divcbinfo);
if (n != 0) {
err = EBUSY;
+ INP_INFO_WUNLOCK(&divcbinfo);
break;
}
ip_divert_ptr = NULL;
err = pf_proto_unregister(PF_INET, IPPROTO_DIVERT, SOCK_RAW);
+ INP_INFO_WUNLOCK(&divcbinfo);
INP_INFO_LOCK_DESTROY(&divcbinfo);
break;
default:
OpenPOWER on IntegriCloud