On Fri, Nov 29, 2013 at 12:21:02AM -0500, Carlos O'Donell wrote:
All we need to do is extend the kernel infrastructure to create
a signal entry trampoline like it does for signal return. This isn't
impossible, but requires work.
Kernel help is not required for this. You just set set the signal
handler address to your wrapper in libc when making the rt_sigaction
syscall, and then have the wrapper call the real signal handler
function, whose address is stored in userspace. There are some nasty
atomicity/synchronization issues to cover with the race window between
the rt_sigaction syscall (which might change flags affecting how the
signal handler runs even though the new handler address will always be
the same) and replacing the pointer in userspace, and keeping this
entire operation AS-safe, but I'm pretty sure it's possible.