@@ -905,9 +905,8 @@ pub mod statik {
905905pub mod fast {
906906 use super :: lazy:: LazyKeyInner ;
907907 use crate :: cell:: Cell ;
908- use crate :: fmt;
909- use crate :: mem;
910908 use crate :: sys:: thread_local_dtor:: register_dtor;
909+ use crate :: { fmt, mem, panic} ;
911910
912911 #[ derive( Copy , Clone ) ]
913912 enum DtorState {
@@ -1028,10 +1027,15 @@ pub mod fast {
10281027 // `Option<T>` to `None`, and `dtor_state` to `RunningOrHasRun`. This
10291028 // causes future calls to `get` to run `try_initialize_drop` again,
10301029 // which will now fail, and return `None`.
1031- unsafe {
1030+ //
1031+ // Wrap the call in a catch to ensure unwinding is caught in the event
1032+ // a panic takes place in a destructor.
1033+ if let Err ( _) = panic:: catch_unwind ( panic:: AssertUnwindSafe ( || unsafe {
10321034 let value = ( * ptr) . inner . take ( ) ;
10331035 ( * ptr) . dtor_state . set ( DtorState :: RunningOrHasRun ) ;
10341036 drop ( value) ;
1037+ } ) ) {
1038+ rtabort ! ( "thread local panicked on drop" ) ;
10351039 }
10361040 }
10371041}
@@ -1044,10 +1048,8 @@ pub mod fast {
10441048pub mod os {
10451049 use super :: lazy:: LazyKeyInner ;
10461050 use crate :: cell:: Cell ;
1047- use crate :: fmt;
1048- use crate :: marker;
1049- use crate :: ptr;
10501051 use crate :: sys_common:: thread_local_key:: StaticKey as OsStaticKey ;
1052+ use crate :: { fmt, marker, panic, ptr} ;
10511053
10521054 /// Use a regular global static to store this key; the state provided will then be
10531055 /// thread-local.
@@ -1137,12 +1139,17 @@ pub mod os {
11371139 //
11381140 // Note that to prevent an infinite loop we reset it back to null right
11391141 // before we return from the destructor ourselves.
1140- unsafe {
1142+ //
1143+ // Wrap the call in a catch to ensure unwinding is caught in the event
1144+ // a panic takes place in a destructor.
1145+ if let Err ( _) = panic:: catch_unwind ( || unsafe {
11411146 let ptr = Box :: from_raw ( ptr as * mut Value < T > ) ;
11421147 let key = ptr. key ;
11431148 key. os . set ( ptr:: invalid_mut ( 1 ) ) ;
11441149 drop ( ptr) ;
11451150 key. os . set ( ptr:: null_mut ( ) ) ;
1151+ } ) {
1152+ rtabort ! ( "thread local panicked on drop" ) ;
11461153 }
11471154 }
11481155}
0 commit comments