SIGINT, longjmp

Hal Murray hmurray at megapathdsl.net
Wed Jan 27 02:05:52 UTC 2016


esr at thyrsus.com said:
> I don't know of any functions that are specifically unsafe around setjmp()/
> longjmp().

The interesting case is longjmp-ing from a signal handler.

> The right way to think about setjmp()/longjmp() is as a save/restore of the
> processor's register state, including  the stack and frame pointers.  It
> doesn't have the concurrency issues that threads do because it doesn't alter
> static memory or the heap.

It doesn't alter the heap, but it doesn't restore it either.

Anything that calls malloc is an opportunity for a storage leak.  Jmp-ing 
from a signal handler yanks you out of the middle of a routine without any 
opportunity for cleanup.

I suspect getaddrinfo masks or intercepts SIGINT, but I haven't found 
anything like that in the man pages.  The symptom is that ^C doesn't work 
right away but does work after several seconds, a reasonable time for a DNS 
lookup if you need to retransmit or have a bloated link.

A signal handler is roughly equivalent to a short-lived thread.  The Linux 
man page has a list of routines that are guaranteed to work crrectly from a 
handler.  It doesn't say anything about longjmp.  The man page for longjmp 
doesn't say anything about signals other than siglongjmp restores the mask.


-- 
These are my opinions.  I hate spam.





More information about the devel mailing list