Commit e384f414 authored by Ian Wienand's avatar Ian Wienand Committed by Tony Luck

[IA64] set_thread_area fails in IA32 chroot

I tried to upgrade an IA32 chroot on my IA64 to a new glibc with TLS.
It kept dying because set_thread_area was returning -ESRCH
(bugs.debian.org/451939).

I instrumented arch/ia64/ia32/sys_ia32.c:get_free_idx() and ended up
seeing output like

[pid] idx   desc->a  desc->b
-----------------------------
[2710] 0 -> c6b0ffff 40dff31b
[2710] 1 -> 0 0
[2710] 2 -> 0 0

[2710] 0 -> c6b0ffff 40dff31b
[2710] 1 -> c6b0ffff 40dff31b
[2710] 2 -> 0 0

[2711] 0 -> c6b0ffff 40dff31b
[2711] 1 -> c6b0ffff 40dff31b
[2711] 2 -> 48c0ffff 40dff317

which suggested to me that TLS pointers were surviving exec() calls,
leading to GDT pointers filling up and the eventual failure of
get_free_idx().

I think the solution is flushing the tls array on exec.
Signed-Off-By: default avatarIan Wienand <ianw@gelato.unsw.edu.au>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent ee211b37
...@@ -739,6 +739,7 @@ flush_thread (void) ...@@ -739,6 +739,7 @@ flush_thread (void)
ia32_drop_ia64_partial_page_list(current); ia32_drop_ia64_partial_page_list(current);
current->thread.task_size = IA32_PAGE_OFFSET; current->thread.task_size = IA32_PAGE_OFFSET;
set_fs(USER_DS); set_fs(USER_DS);
memset(current->thread.tls_array, 0, sizeof(current->thread.tls_array));
} }
#endif #endif
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment