Saving errno around signal handlers

Florian Weimer fweimer@redhat.com
Mon Mar 3 08:42:00 GMT 2014


On 03/01/2014 01:31 AM, Rich Felker wrote:
> On Fri, Feb 28, 2014 at 05:58:54PM +0100, Florian Weimer wrote:
>> On 02/28/2014 05:49 PM, Richard Henderson wrote:
>>> On 02/28/2014 03:49 AM, Florian Weimer wrote:
>>>>
>>>> In all cases (kernel and glibc implementation), we can use a tail call to make
>>>> sure that the stack layout looks like it is at present (at least on
>>>> architectures with an available callee-saved register), and we would not have
>>>> to adjust GDB and other tools.
>>>
>>> How's that?  A tail call would not be able to "restore" anything afterward.
>>
>> We already have the restorer that calls sigreturn, and could add
>>
>>          movq    errno@gottpoff(%rip), %rdi
>>          movl    %r12d, %fs:(%rdi)
>>
>> right before that.
>
> This does not support nested signal handlers. The saved errno must be
> on the stack frame of the trampoline calling the real signal handler,
> not a fixed TLS location.

In this example, the saved errno value is in the %r12d register, which 
is callee-saved, and I suppose that should address your concern.

-- 
Florian Weimer / Red Hat Product Security Team



More information about the Libc-alpha mailing list