Commit Graph

21 Commits

Author SHA1 Message Date
9ae8d5fc71 fix all implicit conversion between signed/unsigned pointers
sadly the C language does not specify any such implicit conversion, so
this is not a matter of just fixing warnings (as gcc treats it) but
actual errors. i would like to revisit a number of these changes and
possibly revise the types used to reduce the number of casts required.
2011-03-25 16:34:03 -04:00
b470030f83 overhaul cancellation to fix resource leaks and dangerous behavior with signals
this commit addresses two issues:

1. a race condition, whereby a cancellation request occurring after a
syscall returned from kernelspace but before the subsequent
CANCELPT_END would cause cancellable resource-allocating syscalls
(like open) to leak resources.

2. signal handlers invoked while the thread was blocked at a
cancellation point behaved as if asynchronous cancellation mode wer in
effect, resulting in potentially dangerous state corruption if a
cancellation request occurs.

the glibc/nptl implementation of threads shares both of these issues.

with this commit, both are fixed. however, cancellation points
encountered in a signal handler will not be acted upon if the signal
was received while the thread was already at a cancellation point.
they will of course be acted upon after the signal handler returns, so
in real-world usage where signal handlers quickly return, it should
not be a problem. it's possible to solve this problem too by having
sigaction() wrap all signal handlers with a function that uses a
pthread_cleanup handler to catch cancellation, patch up the saved
context, and return into the cancellable function that will catch and
act upon the cancellation. however that would be a lot of complexity
for minimal if any benefit...
2011-03-24 14:18:00 -04:00
aa398f56fa global cleanup to use the new syscall interface 2011-03-20 00:16:43 -04:00
685e40bb09 syscall overhaul part two - unify public and internal syscall interface
with this patch, the syscallN() functions are no longer needed; a
variadic syscall() macro allows syscalls with anywhere from 0 to 6
arguments to be made with a single macro name. also, manually casting
each non-integer argument with (long) is no longer necessary; the
casts are hidden in the macros.

some source files which depended on being able to define the old macro
SYSCALL_RETURNS_ERRNO have been modified to directly use __syscall()
instead of syscall(). references to SYSCALL_SIGSET_SIZE and SYSCALL_LL
have also been changed.

x86_64 has not been tested, and may need a follow-up commit to fix any
minor bugs/oversights.
2011-03-19 21:36:10 -04:00
dc54a7cbb9 fix errors in sigqueue (potential information leak, wrong behavior)
1. any padding in the siginfo struct was not necessarily zero-filled,
so it might have contained private data off the caller's stack.

2. the uid and pid must be filled in from userspace. the previous
rsyscall fix broke rsyscalls because the values were always incorrect.
2011-03-10 18:26:29 -05:00
c8c4ef7d44 remove useless return value checks for functions that cannot fail 2011-03-10 11:02:29 -05:00
0f8cc94d68 make sigsuspend a cancellation point 2011-03-10 11:01:11 -05:00
5b9429adb7 make sigtimedwait a cancellation point 2011-03-10 10:59:50 -05:00
0a949ebdf0 don't fail with EINTR in sigtimedwait
POSIX allows either behavior, but sigwait is not allowed to fail with
EINTR, so the retry loop would have to be in one or the other anyway.
2011-03-10 10:43:09 -05:00
0558683d3d fix sigsuspend syscall 2011-03-10 10:26:16 -05:00
6871fd773d make sigaltstack work (missing macros in signal.h, error conditions) 2011-03-10 10:17:29 -05:00
500c969f05 fix error handling for pthread_sigmask
it must return errno, not -1, and should reject invalud values for how.
2011-03-09 20:31:06 -05:00
0bed7e0acf fix race condition in raise - just mask signals
a signal handler could fork after the pid/tid were read, causing the
wrong process to be signalled. i'm not sure if this is supposed to
have UB or not, but raise is async-signal-safe, so it probably is
allowed. the current solution is slightly expensive so this
implementation is likely to be changed in the future.
2011-03-09 20:07:24 -05:00
370f78f2c8 fix raise semantics with threads. 2011-03-09 19:42:06 -05:00
96f2197494 fix null pointer dereference introduced in last sigprocmask commit 2011-02-20 15:16:04 -05:00
a49c119276 prevent sigprocmask/pthread_sigmask from blocking implementation signals
this code was wrongly disabled because the old version was trying to
be too clever and didn't work. replaced it with a simple version for
now.
2011-02-19 10:51:13 -05:00
1e12632591 Port musl to x86-64. One giant commit! 2011-02-15 07:32:09 -05:00
1322cb82a3 header cleanup, conformance fixes - signals 2011-02-14 20:33:54 -05:00
dc3776d445 fix previous commit that broke sigreturn. looks like the asm is needed. 2011-02-13 19:01:43 -05:00
e1d8d25a50 fix omission that kept sa_restorer from being used 2011-02-13 16:46:33 -05:00
0b44a0315b initial check-in, version 0.5.0 2011-02-12 00:22:29 -05:00