Re: sigaction, fork, malloc, and futex

From: chris
Date: Tue May 04 2004 - 17:33:57 EST


Hi-

On Tue, 4 May 2004, Steve Beaty wrote:

>
> anyone have a clue on this one? we set up a signal handler, create
> a child that sends that signal, and have the signal handler fork
> another child. if there is a malloc(), the second child gets stuck
> in a futex(); without the malloc(), no problem. 2.4.20-30.9
> kernel. straces at the end. any help would be appreciated.
> thanks!

Your signal handler function is illegally calling non-reentrant functions.
The *printf() family of functions are going to need to call malloc() to
allocate buffers. malloc() cannot be re-entered.

So specifically your deadlock sequence is:

Parent:
fork()
fprintf()
-> malloc()
-> take a malloc() lock
(Child schedules and sends SIGALRM at this point)
SIGALRM:
fprintf()
-> malloc()
-> try to take a malloc() lock
-> deadlock, lock is already taken and will never be released!

Modern glibc / kernel combinations which use futexes in the malloc code
really seem to expose this race.

Cheers
Chris
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/