From 0c6a093afa7cd6943551b4855b3cc2588befdf3f Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 11 Nov 2018 10:06:41 +0100 Subject: [PATCH 1/2] Unix RwLock: avoid racy access to write_locked --- src/libstd/sys/unix/rwlock.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libstd/sys/unix/rwlock.rs b/src/libstd/sys/unix/rwlock.rs index c754d5b8359a9..8c385ae7760af 100644 --- a/src/libstd/sys/unix/rwlock.rs +++ b/src/libstd/sys/unix/rwlock.rs @@ -14,7 +14,7 @@ use sync::atomic::{AtomicUsize, Ordering}; pub struct RWLock { inner: UnsafeCell, - write_locked: UnsafeCell, + write_locked: UnsafeCell, // guarded by the `inner` RwLock num_readers: AtomicUsize, } @@ -52,7 +52,7 @@ impl RWLock { // allow that because it could lead to aliasing issues. if r == libc::EAGAIN { panic!("rwlock maximum reader count exceeded"); - } else if r == libc::EDEADLK || *self.write_locked.get() { + } else if r == libc::EDEADLK || (r == 0 && *self.write_locked.get()) { if r == 0 { self.raw_unlock(); } From db133901042f7ccc8194b240c8381281bc4be575 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 11 Nov 2018 10:54:13 +0100 Subject: [PATCH 2/2] do not skip return code check in release builds --- src/libstd/sys/unix/rwlock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys/unix/rwlock.rs b/src/libstd/sys/unix/rwlock.rs index 8c385ae7760af..fcd6f7a27b6e3 100644 --- a/src/libstd/sys/unix/rwlock.rs +++ b/src/libstd/sys/unix/rwlock.rs @@ -58,7 +58,7 @@ impl RWLock { } panic!("rwlock read lock would result in deadlock"); } else { - debug_assert_eq!(r, 0); + assert_eq!(r, 0); self.num_readers.fetch_add(1, Ordering::Relaxed); } }