hurd: Fix using interposable hurd_thread_self

Create a private hidden __hurd_thread_self alias, and use that one.

Fixes 2f8ecb58a5
"hurd: Fix x86_64 _hurd_tls_fork" and
c7fcce38c8
"hurd: Make sure to not use tcb->self"

Reported-by: Joseph Myers <joseph@codesourcery.com>
Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
This commit is contained in:
Sergey Bugaev 2023-05-19 17:47:24 +03:00 committed by Samuel Thibault
parent 6af84886ad
commit b44c1e1252
6 changed files with 15 additions and 5 deletions

View File

@ -156,6 +156,7 @@ libc {
__libc_open; __libc_close; __libc_open; __libc_close;
# Used by libpthread. # Used by libpthread.
__hurd_thread_self;
_hurd_sigstate_set_global_rcv; _hurd_sigstate_set_global_rcv;
_hurd_sigstate_lock; _hurd_sigstate_lock;
_hurd_sigstate_pending; _hurd_sigstate_pending;

View File

@ -19,7 +19,10 @@
#include <hurd/signal.h> #include <hurd/signal.h>
thread_t thread_t
hurd_thread_self (void) __hurd_thread_self (void)
{ {
return _hurd_self_sigstate ()->thread; return _hurd_self_sigstate ()->thread;
} }
libc_hidden_def (__hurd_thread_self)
weak_alias (__hurd_thread_self, hurd_thread_self)

View File

@ -11,5 +11,8 @@ void _hurd_libc_proc_init (char **argv);
libc_hidden_proto (_hurd_exec_paths) libc_hidden_proto (_hurd_exec_paths)
libc_hidden_proto (_hurd_init) libc_hidden_proto (_hurd_init)
libc_hidden_proto (_hurd_libc_proc_init) libc_hidden_proto (_hurd_libc_proc_init)
extern thread_t __hurd_thread_self (void);
libc_hidden_proto (__hurd_thread_self)
#endif #endif
#endif #endif

View File

@ -79,7 +79,7 @@ __pthread_setup (struct __pthread *thread,
{ {
error_t err; error_t err;
if (thread->kernel_thread == hurd_thread_self ()) if (thread->kernel_thread == __hurd_thread_self ())
/* Fix up the TCB for the main thread. The C library has already /* Fix up the TCB for the main thread. The C library has already
installed a TCB, which we want to keep using. This TCB must not installed a TCB, which we want to keep using. This TCB must not
be freed so don't register it in the thread structure. On the be freed so don't register it in the thread structure. On the

View File

@ -56,7 +56,7 @@ __pthread_setup (struct __pthread *thread,
struct i386_thread_state state; struct i386_thread_state state;
struct i386_fsgs_base_state fsgs_state; struct i386_fsgs_base_state fsgs_state;
if (thread->kernel_thread == hurd_thread_self ()) if (thread->kernel_thread == __hurd_thread_self ())
/* Fix up the TCB for the main thread. The C library has already /* Fix up the TCB for the main thread. The C library has already
installed a TCB, which we want to keep using. This TCB must not installed a TCB, which we want to keep using. This TCB must not
be freed so don't register it in the thread structure. On the be freed so don't register it in the thread structure. On the

View File

@ -132,6 +132,10 @@ THREAD_TCB (thread_t thread,
((descr)->pointer_guard \ ((descr)->pointer_guard \
= THREAD_GETMEM (THREAD_SELF, pointer_guard)) = THREAD_GETMEM (THREAD_SELF, pointer_guard))
/* From hurd.h, reproduced here to avoid a circular include. */
extern thread_t __hurd_thread_self (void);
libc_hidden_proto (__hurd_thread_self)
/* Set up TLS in the new thread of a fork child, copying from the original. */ /* Set up TLS in the new thread of a fork child, copying from the original. */
static inline kern_return_t __attribute__ ((unused)) static inline kern_return_t __attribute__ ((unused))
_hurd_tls_fork (thread_t child, thread_t orig, _hurd_tls_fork (thread_t child, thread_t orig,
@ -141,8 +145,7 @@ _hurd_tls_fork (thread_t child, thread_t orig,
struct i386_fsgs_base_state state; struct i386_fsgs_base_state state;
mach_msg_type_number_t state_count = i386_FSGS_BASE_STATE_COUNT; mach_msg_type_number_t state_count = i386_FSGS_BASE_STATE_COUNT;
extern thread_t hurd_thread_self (void); if (orig != __hurd_thread_self ())
if (orig != hurd_thread_self ())
{ {
err = __thread_get_state (orig, i386_FSGS_BASE_STATE, err = __thread_get_state (orig, i386_FSGS_BASE_STATE,
(thread_state_t) &state, (thread_state_t) &state,