fix fork of processes with active async io contexts
authorRich Felker <dalias@aerifal.cx>
Mon, 28 Sep 2020 22:38:27 +0000 (18:38 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 28 Sep 2020 22:56:20 +0000 (18:56 -0400)
commit34904d830a9fd1f6fc47218f38c111698303d2fe
treec43e8b5659386f5a3ed4f5e749d389f2fb91027b
parenta5aff1972c9e3981566414b09a28e331ccd2be5d
fix fork of processes with active async io contexts

previously, if a file descriptor had aio operations pending in the
parent before fork, attempting to close it in the child would attempt
to cancel a thread belonging to the parent. this could deadlock, fail,
or crash the whole process of the cancellation signal handler was not
yet installed in the parent. in addition, further use of aio from the
child could malfunction or deadlock.

POSIX specifies that async io operations are not inherited by the
child on fork, so clear the entire aio fd map in the child, and take
the aio map lock (with signals blocked) across the fork so that the
lock is kept in a consistent state.
src/aio/aio.c
src/internal/pthread_impl.h
src/process/fork.c