diff options
author | oleg <oleg@FreeBSD.org> | 2006-10-05 09:48:25 +0000 |
---|---|---|
committer | oleg <oleg@FreeBSD.org> | 2006-10-05 09:48:25 +0000 |
commit | 60fe2e7137c75004ef1d01ee01807213e046b38a (patch) | |
tree | 6c591b9ea5bd06cedc100b5a5c45332188540ff1 /sys/contrib | |
parent | 84361990fcb86bc1f9b4cbbca14bc88162f7bec2 (diff) | |
download | FreeBSD-src-60fe2e7137c75004ef1d01ee01807213e046b38a.zip FreeBSD-src-60fe2e7137c75004ef1d01ee01807213e046b38a.tar.gz |
Workaround bad locking design:
do not try to lock/unlock destroyed/non-existsing mutex.
PR: kern/103569
Reviewed by: guido
Approved by: glebius (mentor)
Silence from: darrenr
MFC: 2 week
Diffstat (limited to 'sys/contrib')
-rw-r--r-- | sys/contrib/ipfilter/netinet/ip_fil_freebsd.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c b/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c index d278781..64421e0 100644 --- a/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c +++ b/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c @@ -481,7 +481,8 @@ int mode; } SPL_NET(s); - READ_ENTER(&ipf_global); + if (fr_running > 0) + READ_ENTER(&ipf_global); error = fr_ioctlswitch(unit, data, cmd, mode); if (error != -1) { @@ -514,7 +515,10 @@ int mode; else (void) ipldetach(); } else { - error = ipldetach(); + if (fr_running <= 0) + error = 0; + else + error = ipldetach(); if (error == 0) fr_running = -1; } @@ -627,7 +631,9 @@ int mode; break; } - RWLOCK_EXIT(&ipf_global); + if (fr_running > 0) + if (mtx_owned(&(&ipf_global)->ipf_lk)) + RWLOCK_EXIT(&ipf_global); SPL_X(s); return error; |