mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 22:30:07 +00:00
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:
parent
20bc801b3d
commit
72e7ffc37f
@ -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>
|
2018-03-18 Agustina Arzille <avarzille@riseup.net>
|
||||||
|
|
||||||
* sysdeps/mach/libc-lock.h (__libc_cleanup_frame): Define structure.
|
* sysdeps/mach/libc-lock.h (__libc_cleanup_frame): Define structure.
|
||||||
|
@ -111,36 +111,41 @@ static inline const char * __attribute__ ((unused))
|
|||||||
_hurd_tls_init (tcbhead_t *tcb)
|
_hurd_tls_init (tcbhead_t *tcb)
|
||||||
{
|
{
|
||||||
HURD_TLS_DESC_DECL (desc, 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"
|
/* This field is used by TLS accesses to get our "thread pointer"
|
||||||
from the TLS point of view. */
|
from the TLS point of view. */
|
||||||
tcb->tcb = tcb;
|
tcb->tcb = tcb;
|
||||||
|
|
||||||
/* Cache our thread port. */
|
|
||||||
tcb->self = __mach_thread_self ();
|
|
||||||
|
|
||||||
/* Get the first available selector. */
|
/* Get the first available selector. */
|
||||||
int sel = -1;
|
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)
|
if (err == MIG_BAD_ID)
|
||||||
{
|
{
|
||||||
/* Old kernel, use a per-thread LDT. */
|
/* Old kernel, use a per-thread LDT. */
|
||||||
sel = 0x27;
|
sel = 0x27;
|
||||||
err = __i386_set_ldt (tcb->self, sel, &desc, 1);
|
err = __i386_set_ldt (self, sel, &desc, 1);
|
||||||
assert_perror (err);
|
assert_perror (err);
|
||||||
if (err)
|
if (err)
|
||||||
return "i386_set_ldt failed";
|
{
|
||||||
|
msg = "i386_set_ldt failed";
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (err)
|
else if (err)
|
||||||
{
|
{
|
||||||
assert_perror (err); /* Separate from above with different line #. */
|
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. */
|
/* Now install the new selector. */
|
||||||
asm volatile ("mov %w0, %%gs" :: "q" (sel));
|
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
|
/* Code to initially initialize the thread pointer. This might need
|
||||||
|
Loading…
Reference in New Issue
Block a user