rtld: Sync 5/7 - Fix fd leak with parallel dlopen and fork
authorJohn Marino <draco@marino.st>
Wed, 12 Jun 2013 23:42:14 +0000 (01:42 +0200)
committerJohn Marino <draco@marino.st>
Thu, 13 Jun 2013 11:12:08 +0000 (13:12 +0200)
commit042953d8e3173add9848fe8ddbedc413a77cccc4
treeb187f1e11dfdc795fcecf6270bee6074fa235853
parentda404cb4ad58fa4443ec9a94a036420276919b79
rtld: Sync 5/7 - Fix fd leak with parallel dlopen and fork

Rtld did not set FD_CLOEXEC on its internal file descriptors; therefore,
such a file descriptor may be passed to a process created by another
thread running in parallel to dlopen() or fdlopen().

No other threads are expected to be running during parsing of the hints
and libmap files but the file descriptors need not be passed to child
processes so add O_CLOEXEC there as well.

As the F_DUPFD_CLOEXEC support was added in the kernel today, rtld
will temporarily fall back to separate dup/cloexec commands if
F_DUPFD_CLOEXEC fails.  This fallback should be removed before
3.6 branches.

Taken from:
FreeBSD SVN 242587 (04 NOV 2012)
libexec/rtld-elf/libmap.c
libexec/rtld-elf/rtld.c