[tsan] Clear ThreadSignalContext shadow memory on thread exit (#230708)
[tsan] Clear ThreadSignalContext shadow memory on thread exit
`SigCtx(ThreadState *thr)` allocates a per-thread `ThreadSignalContext`
(`sctx`) via internal `MmapOrDie(sizeof(*sctx))`. When a signal is
delivered to a user `sa_sigaction` handler, `CallUserSignalHandler`
passes `&sctx->pending_signals[sig].siginfo` and
`&sctx->pending_signals[sig].ctx` directly to the user handler. Any
instrumented reads or writes to the `siginfo_t` or `ucontext_t`
arguments populate TSan shadow memory for the `sctx` mapping.
Previously, `PlatformCleanUpThreadState` unmapped `sctx` via raw
`UnmapOrDie(sctx, sizeof(*sctx))` upon thread exit without clearing its
shadow memory, leaving stale shadow entries behind when the virtual
pages were reused or shared a shadow page with an adjacent mapping.
Call `DontNeedShadowFor((uptr)sctx, RoundUpTo(sizeof(*sctx),
GetPageSizeCached()))`
before `UnmapOrDie(sctx, sizeof(*sctx))` in
`PlatformCleanUpThreadState`.
Fixes #230706
Assisted-by: Gemini