Hurd: fix port leak in TLS

* sysdeps/mach/hurd/i386/tls.h (_hurd_tls_init): Use a temporary
	thread reference.
This commit is contained in:
Richard Braun 2018-03-18 20:27:16 +01:00 committed by Samuel Thibault
parent 20bc801b3d
commit 72e7ffc37f
2 changed files with 18 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2018-03-18 Richard Braun <rbraun@sceen.net>
* sysdeps/mach/hurd/i386/tls.h (_hurd_tls_init): Use a temporary
thread reference.
2018-03-18 Agustina Arzille <avarzille@riseup.net>
* sysdeps/mach/libc-lock.h (__libc_cleanup_frame): Define structure.

View File

@ -111,36 +111,41 @@ static inline const char * __attribute__ ((unused))
_hurd_tls_init (tcbhead_t *tcb)
{
HURD_TLS_DESC_DECL (desc, tcb);
thread_t self = __mach_thread_self ();
const char *msg = NULL;
/* This field is used by TLS accesses to get our "thread pointer"
from the TLS point of view. */
tcb->tcb = tcb;
/* Cache our thread port. */
tcb->self = __mach_thread_self ();
/* Get the first available selector. */
int sel = -1;
error_t err = __i386_set_gdt (tcb->self, &sel, desc);
error_t err = __i386_set_gdt (self, &sel, desc);
if (err == MIG_BAD_ID)
{
/* Old kernel, use a per-thread LDT. */
sel = 0x27;
err = __i386_set_ldt (tcb->self, sel, &desc, 1);
err = __i386_set_ldt (self, sel, &desc, 1);
assert_perror (err);
if (err)
return "i386_set_ldt failed";
{
msg = "i386_set_ldt failed";
goto out;
}
}
else if (err)
{
assert_perror (err); /* Separate from above with different line #. */
return "i386_set_gdt failed";
msg = "i386_set_gdt failed";
goto out;
}
/* Now install the new selector. */
asm volatile ("mov %w0, %%gs" :: "q" (sel));
return 0;
out:
__mach_port_deallocate (__mach_task_self (), self);
return msg;
}
/* Code to initially initialize the thread pointer. This might need