SIGINT, longjmp

Eric S. Raymond esr at thyrsus.com
Wed Jan 27 06:08:54 UTC 2016


Hal Murray <hmurray at megapathdsl.net>:
> 
> 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.

Right.  I believe the way a signal handler works is actually like a
setjmp/longjmp; that is, on receipt of a signal the register contect
is saved, the handler is called, then on exit the register context is
restored.

It probably does follow that you don't want to longjmp() out of a signal
handler; hidden context like signal block masks mightnot be restored.
I note that the GPSD code does not do this.  I think I used to know details
about this that I've forgotten.

> > 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.

Correct.

> 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.

Correct.

> 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.

Ah, it's probably doing a sigsuspend(2).
-- 
		<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>


More information about the devel mailing list