about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <jtitor@2k36.org>2021-07-11 01:15:40 +0900
committerGitHub <noreply@github.com>2021-07-11 01:15:40 +0900
commit0ca5fc2e33f8dacc75872a7528870bf7ff1a157b (patch)
treee8fbfad04387c5ed5e1156f59d98a3d6fd265009
parent632f84f4cbb30e17f749a81e0ca542f0e2aa50a8 (diff)
parentdbc2b55baf2e6124bedea62d4ec67ab212a57b85 (diff)
downloadrust-0ca5fc2e33f8dacc75872a7528870bf7ff1a157b.tar.gz
rust-0ca5fc2e33f8dacc75872a7528870bf7ff1a157b.zip
Rollup merge of #87011 - RalfJung:thread-id-supply-shortage, r=nagisa
avoid reentrant lock acquire when ThreadIds run out

Discovered by `@bjorn3`
-rw-r--r--library/std/src/thread/mod.rs3
1 files changed, 2 insertions, 1 deletions
diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs
index da2d1160493..9f7e6b95dfb 100644
--- a/library/std/src/thread/mod.rs
+++ b/library/std/src/thread/mod.rs
@@ -999,11 +999,12 @@ impl ThreadId {
         static mut COUNTER: u64 = 1;
 
         unsafe {
-            let _guard = GUARD.lock();
+            let guard = GUARD.lock();
 
             // If we somehow use up all our bits, panic so that we're not
             // covering up subtle bugs of IDs being reused.
             if COUNTER == u64::MAX {
+                drop(guard); // in case the panic handler ends up calling `ThreadId::new()`, avoid reentrant lock acquire.
                 panic!("failed to generate unique thread ID: bitspace exhausted");
             }