summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/i386/sigaction.c
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-10-19 13:27:09 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-10-19 13:27:09 +0000
commit61f80c8e515dbc4a6cfcfedf824d762482c06afc (patch)
tree85365a5f78f14333faa0e3e1818502bf6bd9aad9 /libc/sysdeps/linux/i386/sigaction.c
parentf6666438e8783c36e515f03904533d4ff2ea387e (diff)
- fix sigaction on older kernels (Michael Deutschmann)
In issue #5554 Michael wrote: The implementation of sigaction on i386 for older kernels makes the system call using an inline asm element with two flaws: 1. The asm is not marked as depending on the kact structure or modifying the koact structure. Thus, GCC is free to assume these structures need not be kept consistent, allowing it to remove all initialization of kact. 2. The asm allows the signal number to be provided as a memory reference. But this allows GCC to provide a stack-relative operand, which will break because the assembler saves %ebx on the stack before using that operand. 1 didn't use to be a problem in practice because GCC 4.2.* didn't seize the optimization opportunity. GCC 4.3.2, however, optimizes out the "kact.sa_flags = act->sa_flags | SA_RESTORER;" line, so that the kernel sees garbage in sa_flags. This can result in the kernel seeing the SA_RESETHAND flag, causing erratic behaviour in signal dependent programs. 2 becomes an issue if "-fomit-frame-pointer" is provided. In uClibc-0.9.29 it isn't, uClibc-0.9.30-rc2 does use the flag by default.
Diffstat (limited to 'libc/sysdeps/linux/i386/sigaction.c')
-rw-r--r--libc/sysdeps/linux/i386/sigaction.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/libc/sysdeps/linux/i386/sigaction.c b/libc/sysdeps/linux/i386/sigaction.c
index e8729647f..79eb6fde3 100644
--- a/libc/sysdeps/linux/i386/sigaction.c
+++ b/libc/sysdeps/linux/i386/sigaction.c
@@ -99,11 +99,11 @@ int __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oa
}
__asm__ __volatile__ ("pushl %%ebx\n"
- "movl %2, %%ebx\n"
+ "movl %3, %%ebx\n"
"int $0x80\n"
"popl %%ebx"
- : "=a" (result)
- : "0" (__NR_sigaction), "mr" (sig),
+ : "=a" (result), "=m" (koact)
+ : "0" (__NR_sigaction), "r" (sig), "m" (kact),
"c" (act ? __ptrvalue (&kact) : 0),
"d" (oact ? __ptrvalue (&koact) : 0));