mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
x86: tls prevent_tail_call
Fix a kernel bug (vmware boot problem) reported by Tomasz Grobelny,
which occurs with certain .config variants and gccs.
The x86 TLS cleanup in commit efd1ca52d0
made the sys_set_thread_area and sys_get_thread_area functions ripe for
tail call optimization. If the compiler chooses to use it for them, it
can clobber the user trap frame because these are asmlinkage functions.
Reported-by: Tomasz Grobelny <tomasz@grobelny.oswiecenia.net>
Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
c0f4133b8f
commit
3d00daf446
1 changed files with 6 additions and 2 deletions
|
@ -91,7 +91,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
|
|||
|
||||
asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
|
||||
{
|
||||
return do_set_thread_area(current, -1, u_info, 1);
|
||||
int ret = do_set_thread_area(current, -1, u_info, 1);
|
||||
prevent_tail_call(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@ -139,7 +141,9 @@ int do_get_thread_area(struct task_struct *p, int idx,
|
|||
|
||||
asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
|
||||
{
|
||||
return do_get_thread_area(current, -1, u_info);
|
||||
int ret = do_get_thread_area(current, -1, u_info);
|
||||
prevent_tail_call(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int regset_tls_active(struct task_struct *target,
|
||||
|
|
Loading…
Reference in a new issue