projects
/
GitHub
/
moto-9609
/
android_kernel_motorola_exynos9610.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
1fae027
)
x86, signals: fix xine & firefox bustage
author
Hiroshi Shimamoto
<h-shimamoto@ct.jp.nec.com>
Tue, 3 Mar 2009 01:20:01 +0000
(17:20 -0800)
committer
Ingo Molnar
<mingo@elte.hu>
Tue, 3 Mar 2009 08:03:12 +0000
(09:03 +0100)
Impact: fix bad frame in rt_sigreturn on 64-bit
After commit
97286a2b64725aac2d584ddd1f94871f9991d5a1
some applications
fail to return from signal handler:
[ 145.150133] firefox[3250] bad frame in rt_sigreturn frame:
00007f902b44eb28
ip:
352e80b307
sp:
7f902b44ef70
orax:
ffffffffffffffff
in libpthread-2.9.so[
352e800000
+17000]
[ 665.519017] firefox[5420] bad frame in rt_sigreturn frame:
00007faa8deaeb28
ip:
352e80b307
sp:
7faa8deaef70
orax:
ffffffffffffffff
in libpthread-2.9.so[
352e800000
+17000]
The root cause is forgetting to keep 64 byte aligned value of
fpstate for next stack pointer calculation.
Reported-by: Jaswinder Singh Rajput <jaswinder@kernel.org>
Reported-by: Mike Galbraith <efault@gmx.de>
Signed-off-by: Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
LKML-Reference: <
49AC85C1
.
7060600
@ct.jp.nec.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/signal.c
patch
|
blob
|
blame
|
history
diff --git
a/arch/x86/kernel/signal.c
b/arch/x86/kernel/signal.c
index dde3f2ae2371fb39588a7fb84c7ea173c1f65c07..d2cc6428c5875a6103a00757eeeec9ff0831508f 100644
(file)
--- a/
arch/x86/kernel/signal.c
+++ b/
arch/x86/kernel/signal.c
@@
-240,11
+240,10
@@
get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
if (used_math()) {
sp -= sig_xstate_size;
-#ifdef CONFIG_X86_32
- *fpstate = (void __user *) sp;
-#else /* !CONFIG_X86_32 */
- *fpstate = (void __user *)round_down(sp, 64);
-#endif /* CONFIG_X86_32 */
+#ifdef CONFIG_X86_64
+ sp = round_down(sp, 64);
+#endif /* CONFIG_X86_64 */
+ *fpstate = (void __user *)sp;
if (save_i387_xstate(*fpstate) < 0)
return (void __user *)-1L;