From 4b0caec04bb1dd73373b0660841c14b72507bede Mon Sep 17 00:00:00 2001 From: Mahdi Ali-Raihan Date: Sat, 28 Mar 2026 19:19:10 -0400 Subject: [PATCH 1/2] Panic/return false on overflow in no_threads read/try_read impl --- library/std/src/sys/sync/rwlock/no_threads.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/library/std/src/sys/sync/rwlock/no_threads.rs b/library/std/src/sys/sync/rwlock/no_threads.rs index 6b919bde80bb..81202ba8a3ae 100644 --- a/library/std/src/sys/sync/rwlock/no_threads.rs +++ b/library/std/src/sys/sync/rwlock/no_threads.rs @@ -17,6 +17,10 @@ pub const fn new() -> RwLock { #[inline] pub fn read(&self) { let m = self.mode.get(); + + // Check for overflow. + assert!(m == isize::MAX, "too many active read locks on RwLock"); + if m >= 0 { self.mode.set(m + 1); } else { @@ -28,6 +32,9 @@ pub fn read(&self) { pub fn try_read(&self) -> bool { let m = self.mode.get(); if m >= 0 { + if m == isize::MAX { + return false; + } self.mode.set(m + 1); true } else { From 1d7d435d08c59f917b3fc266a2844fe002cfa7d7 Mon Sep 17 00:00:00 2001 From: Mahdi Ali-Raihan Date: Sun, 29 Mar 2026 20:06:25 -0400 Subject: [PATCH 2/2] Panic on unlocking a non-read locked RwLock + provided better error msgs --- library/std/src/sys/sync/rwlock/no_threads.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/library/std/src/sys/sync/rwlock/no_threads.rs b/library/std/src/sys/sync/rwlock/no_threads.rs index 81202ba8a3ae..6de5577504c4 100644 --- a/library/std/src/sys/sync/rwlock/no_threads.rs +++ b/library/std/src/sys/sync/rwlock/no_threads.rs @@ -17,12 +17,8 @@ pub const fn new() -> RwLock { #[inline] pub fn read(&self) { let m = self.mode.get(); - - // Check for overflow. - assert!(m == isize::MAX, "too many active read locks on RwLock"); - if m >= 0 { - self.mode.set(m + 1); + self.mode.set(m.checked_add(1).expect("rwlock overflowed read locks")); } else { rtabort!("rwlock locked for writing"); } @@ -63,16 +59,19 @@ pub fn try_write(&self) -> bool { #[inline] pub unsafe fn read_unlock(&self) { - self.mode.set(self.mode.get() - 1); + assert!( + self.mode.replace(self.mode.get() - 1) > 0, + "rwlock has not been locked for reading" + ); } #[inline] pub unsafe fn write_unlock(&self) { - assert_eq!(self.mode.replace(0), -1); + assert_eq!(self.mode.replace(0), -1, "rwlock has not been locked for writing"); } #[inline] pub unsafe fn downgrade(&self) { - assert_eq!(self.mode.replace(1), -1); + assert_eq!(self.mode.replace(1), -1, "rwlock has not been locked for writing"); } }