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/