rust/library/std/src
bors 80917360d3 Auto merge of #112292 - thomcc:tls-ohno, r=m-ou-se
Avoid unwind across `extern "C"` in `thread_local::fast_local`

This is a minimal fix for #112285, in case we want a simple patch that can be easily to backported if that's desirable.

*(Note: I have another broader cleanup which I've mostly omitted from here to avoid clutter, except for the `Cell` change, which isn't needed to fix UB, but simplifies safety comments).*

The only tier-1 target that this occurs on in a way that seems likely to cause problems in practice linux-gnu, although I believe some folks care about that platform somewhat 😉. I'm unsure how big of an issue this is. I've seen stuff like this behave quite badly, but there's a number of reasons to think this might actually be "fine in practice".

I've hedged my bets and assumed we'll backport this at least to beta but my feeling is that there's not enough evidence this is a problem worth backporting further than that.

### More details

This issue seems to have existed since `thread_local!`'s `const` init functionality was added. It occurs if you have a `const`-initialized thread local for a type that `needs_drop`, the drop panics, and you're on a target with support for static thread locals. In this case, we will end up defining an `extern "C"` function in the user crate rather than in libstd, and because the user crate will not have `#![feature(c_unwind)]` enabled, their panic will not be caught by an auto-inserted abort guard.

In practice, the actual situation where problems are likely[^ub] is somewhat narrower.

On most targets with static thread locals, we manage the TLS dtor list by hand (for reentrancy reasons among others). In these cases, while the users code may panic, we're calling it inside our own `extern "C"` (or `extern "system"`) function, which seems to (at least in practice) catch the panic and convert it to an abort.

However, on a few targets, most notably linux-gnu with recent glibc (but also fuchsia and redox), a tls dtor registration mechanism exists which we can actually use directly, [`__cxa_thread_atexit_impl`](https://github.com/rust-lang/rust/blob/master/library/std/src/sys/unix/thread_local_dtor.rs#L26-L36).

This is the case that seems most likely to be a cause for concern, as now we're passing a function to the system library and panicking out of it in a case where there are may not be Rust frames above it on the call stack (since it's running thread shutdown), and even if there were, it may not be prepared to handle such unwinding. If that's the case, it'd be bad.

Is it? Dunno. The fact that it's a `__cxa_*` function makes me think they probably have considered that the callback could throw but I have no evidence here and it doesn't seem to be written down anywhere, so it's just a guess. (I would not be surprised if someone comes into this thread to tell me how definitely-bad-news it is).

That said, as I said, all this is actually UB! If this isn't a "technically UB but fine in practice", but all bets are off if this is the kind of thing we are telling LLVM about.

[^ub]: This is UB so take that with a grain of salt -- I'm absolutely making assumptions about how the UB will behave "in practice" here, which is almost certainly a mistake.
2023-06-08 04:44:08 +00:00
..
backtrace
collections rm const traits in libcore 2023-04-16 06:49:27 +00:00
env
error remove fn backtrace 2022-08-01 20:10:40 +00:00
f32 Remove some cfg(not(bootstrap)) 2022-12-11 01:20:18 -05:00
f64 Remove some cfg(not(bootstrap)) 2022-12-11 01:20:18 -05:00
ffi docs: Add missing period 2023-05-19 19:41:41 -05:00
fs Add test for FileTimes 2023-05-15 15:04:45 +01:00
io Rollup merge of #111940 - zirconium-n:io-read-doc-change, r=thomcc 2023-05-26 08:24:08 +02:00
net add examples of port 0 binding behavior 2023-05-13 07:13:52 +00:00
num
os Std support improvement for ps vita target 2023-06-05 19:14:09 +03:00
panic
path make many std tests work in Miri 2022-08-18 18:07:39 -04:00
personality Prevent aborting guard from aborting the process in a forced unwind 2023-05-07 12:35:54 +01:00
prelude correct std::prelude comment 2023-04-27 15:56:57 +02:00
process Implement read_buf for a few more types 2023-03-06 12:24:15 +01:00
sync doc: improve explanation 2023-06-01 12:55:58 +02:00
sys Auto merge of #112292 - thomcc:tls-ohno, r=m-ou-se 2023-06-08 04:44:08 +00:00
sys_common Fix #107910, Shorten backtraces in ICEs 2023-05-17 17:56:26 +08:00
thread Avoid unwind across extern "C" in thread_local::fast_local.rs 2023-06-04 14:54:28 -07:00
time Rollup merge of #103056 - beetrees:timespec-bug-fix, r=thomcc 2023-05-05 18:40:32 +05:30
alloc.rs Revert "Remove #[alloc_error_handler] from the compiler and library" 2023-04-25 00:08:35 +02:00
ascii.rs Add the basic ascii::Char type 2023-05-03 22:09:33 -07:00
backtrace.rs Replace libstd, libcore, liballoc in docs. 2022-12-30 14:00:40 +01:00
env.rs Rollup merge of #109894 - fleetingbytes:109893-var_os-never-returns-an-error, r=cuviper 2023-04-11 20:28:46 -07:00
error.rs remove cfg(bootstrap) 2022-09-26 10:14:45 +02:00
f32.rs Cover edge cases for {f32, f64}.hypot() docs 2023-04-13 22:41:55 +01:00
f64.rs Cover edge cases for {f32, f64}.hypot() docs 2023-04-13 22:41:55 +01:00
fs.rs Auto merge of #109773 - beetrees:set-file-time-improvements, r=Amanieu 2023-05-19 19:53:14 +00:00
keyword_docs.rs enable rust_2018_idioms for doctests 2023-05-07 00:12:29 +03:00
lib.rs use c literals in library 2023-05-31 19:41:51 +03:00
macros.rs Add tidy check for dbg 2022-12-31 15:32:09 +05:30
num.rs
panic.rs Shorten lifetime of even more panic temporaries 2023-05-15 03:47:37 -07:00
panicking.rs Rework handling of recursive panics 2023-05-27 16:35:16 +02:00
path.rs Mark internal functions and traits unsafe 2023-05-15 14:31:00 -04:00
personality.rs Move personality functions to std 2022-08-23 16:12:58 +08:00
primitive_docs.rs Auto merge of #106621 - ozkanonur:enable-elided-lifetimes-for-doctests, r=Mark-Simulacrum 2023-05-08 04:50:28 +00:00
process.rs Auto merge of #106621 - ozkanonur:enable-elided-lifetimes-for-doctests, r=Mark-Simulacrum 2023-05-08 04:50:28 +00:00
rt.rs Replace libstd, libcore, liballoc in line comments. 2022-12-30 14:00:42 +01:00
time.rs update wasi_clock_time_api ref. 2023-04-29 19:04:16 +08:00