diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2022-06-16 11:23:31 +0200 |
|---|---|---|
| committer | Mara Bos <m-ou.se@m-ou.se> | 2022-06-16 12:09:12 +0200 |
| commit | d72294491c5d28449c49b884b620cc24b3cf010f (patch) | |
| tree | a9df2c0fc5270ca3d1188bf63de53246ebad25e6 /library/std/src/sys/unix/locks/pthread_mutex.rs | |
| parent | 392d2728683f140f6125732240e462c43c5caff4 (diff) | |
| download | rust-d72294491c5d28449c49b884b620cc24b3cf010f.tar.gz rust-d72294491c5d28449c49b884b620cc24b3cf010f.zip | |
Leak pthreax_mutex_t when it's dropped while locked.
Diffstat (limited to 'library/std/src/sys/unix/locks/pthread_mutex.rs')
| -rw-r--r-- | library/std/src/sys/unix/locks/pthread_mutex.rs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/library/std/src/sys/unix/locks/pthread_mutex.rs b/library/std/src/sys/unix/locks/pthread_mutex.rs index 916e898d890..98afee69ba6 100644 --- a/library/std/src/sys/unix/locks/pthread_mutex.rs +++ b/library/std/src/sys/unix/locks/pthread_mutex.rs @@ -1,5 +1,5 @@ use crate::cell::UnsafeCell; -use crate::mem::MaybeUninit; +use crate::mem::{forget, MaybeUninit}; use crate::sys::cvt_nz; use crate::sys_common::lazy_box::{LazyBox, LazyInit}; @@ -23,6 +23,24 @@ impl LazyInit for Mutex { unsafe { mutex.init() }; mutex } + + fn destroy(mutex: Box<Self>) { + // We're not allowed to pthread_mutex_destroy a locked mutex, + // so check first if it's unlocked. + if unsafe { mutex.try_lock() } { + unsafe { mutex.unlock() }; + drop(mutex); + } else { + // The mutex is locked. This happens if a MutexGuard is leaked. + // In this case, we just leak the Mutex too. + forget(mutex); + } + } + + fn cancel_init(_: Box<Self>) { + // In this case, we can just drop it without any checks, + // since it cannot have been locked yet. + } } impl Mutex { |
