changeset 17421:ce63398f847f

getgroups: document portability issues Because I actually managed to hit deadlock in libvirt's child process due to glibc's mutex use in user database lookup, I figured it is worth documenting the issue for others to be aware of when writing a privileged multithreaded parent app that spawns child processes owned by non-privileged ids. * doc/glibc-functions/initgroups.texi (initgroups): Mention multithread safety. * doc/posix-functions/getpwuid.texi (getpwuid): Likewise. * doc/posix-functions/getpwuid_r.texi (getpwuid_r): Likewise. * doc/glibc-functions/getgrouplist.texi (getgrouplist): Mention getugroups. * doc/posix-functions/getgroups.texi (getgroups): Mention multithread safety and mgetgroups. Signed-off-by: Eric Blake <eblake@redhat.com>
author Eric Blake <eblake@redhat.com>
date Wed, 22 May 2013 14:21:36 -0600
parents 7266df63bb4d
children 08883714ab3e
files ChangeLog doc/glibc-functions/getgrouplist.texi doc/glibc-functions/initgroups.texi doc/posix-functions/getgroups.texi doc/posix-functions/getpwuid.texi doc/posix-functions/getpwuid_r.texi
diffstat 6 files changed, 31 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2013-05-22  Eric Blake  <eblake@redhat.com>
+
+	getgroups: document portability issues
+	* doc/glibc-functions/initgroups.texi (initgroups): Mention
+	multithread safety.
+	* doc/posix-functions/getpwuid.texi (getpwuid): Likewise.
+	* doc/posix-functions/getpwuid_r.texi (getpwuid_r): Likewise.
+	* doc/glibc-functions/getgrouplist.texi (getgrouplist): Mention
+	getugroups.
+	* doc/posix-functions/getgroups.texi (getgroups): Mention
+	multithread safety and mgetgroups.
+
 2013-05-22  Bernhard Voelker <mail@bernhard-voelker.de>
 
 	test-lchown, test-chown: also skip test if chown fails with EPERM
--- a/doc/glibc-functions/getgrouplist.texi
+++ b/doc/glibc-functions/getgrouplist.texi
@@ -14,3 +14,5 @@
 This function is missing on some platforms:
 Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 11 2011-11, Cygwin 1.7.9, mingw, MSVC 9, BeOS.
 @end itemize
+
+The Gnulib module @code{getugroups} provides a similar API.
--- a/doc/glibc-functions/initgroups.texi
+++ b/doc/glibc-functions/initgroups.texi
@@ -11,6 +11,11 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+This function is unsafe to call between @code{fork} and @code{exec} if
+the parent process is multi-threaded.  Instead, use @code{getgroups} or
+@code{getgrouplist} (or use the gnulib module @code{mgetgroups})
+before forking, and @code{setgroups} in the child.
+@item
 This function is missing on some platforms:
 mingw, MSVC 9, Interix 3.5, BeOS.
 @end itemize
--- a/doc/posix-functions/getgroups.texi
+++ b/doc/posix-functions/getgroups.texi
@@ -26,9 +26,14 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+This function is unsafe to call between @code{fork} and @code{exec} if
+the parent process is multi-threaded.
+@item
 It is unspecified whether the effective group id will be included in
 the returned list, nor whether the list will be sorted in any
 particular order.  For that matter, some platforms include the
 effective group id twice, if it is also a member of the current
 supplemental group ids.
 @end itemize
+
+The Gnulib module @code{mgetgroups} provides a similar API.
--- a/doc/posix-functions/getpwuid.texi
+++ b/doc/posix-functions/getpwuid.texi
@@ -13,6 +13,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+This function is unsafe to call between @code{fork} and @code{exec} if
+the parent process is multi-threaded.  Instead, use @code{getpwuid_r}
+prior to forking.
+@item
 This function is missing on some platforms:
 mingw, MSVC 9.
 @end itemize
--- a/doc/posix-functions/getpwuid_r.texi
+++ b/doc/posix-functions/getpwuid_r.texi
@@ -16,6 +16,9 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+This function is unsafe to call between @code{fork} and @code{exec} if
+the parent process is multi-threaded.  Use it prior to forking.
+@item
 This function is missing on some platforms:
 OpenBSD 3.8, Minix 3.1.8, mingw, MSVC 9, BeOS.
 @end itemize