diff options
-rw-r--r-- | NEWS | 8 | ||||
-rw-r--r-- | THANKS | 1 | ||||
-rw-r--r-- | gl/lib/mgetgroups.c | 10 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/misc/id-groups | 28 |
5 files changed, 47 insertions, 1 deletions
@@ -14,6 +14,14 @@ GNU coreutils NEWS -*- outline -*- default should proceed at the speed of the disk. Previously /dev/urandom was used if available, which is relatively slow on GNU/Linux systems. +** Portability + + `id -G $USER` now works correctly even on Darwin and NetBSD. Previously it + would either truncate the group list to 10, or go into an infinite loop, + due to their non-standard getgroups implementations. + [truncation introduced in coreutils-6.11] + [infinite loop introduced in coreutils-7.1] + * Noteworthy changes in release 7.2 (2009-03-31) [stable] ** New features @@ -525,6 +525,7 @@ Steve McIntyre steve@einval.com Steve Ward planet36@gmail.com Steven G. Johnson stevenj@alum.mit.edu Steven Mocking ufo@quicknet.nl +Steven Parkes smparkes@smparkes.net Steven Schveighoffer schveiguy@yahoo.com Steven P Watson steven@magelico.net Stuart Kemp skemp@peter.bmc.com diff --git a/gl/lib/mgetgroups.c b/gl/lib/mgetgroups.c index e697013ef..736dd87f3 100644 --- a/gl/lib/mgetgroups.c +++ b/gl/lib/mgetgroups.c @@ -81,10 +81,16 @@ mgetgroups (char const *username, gid_t gid, GETGROUPS_T **groups) while (1) { GETGROUPS_T *h; + int last_n_groups = max_n_groups; /* getgrouplist updates max_n_groups to num required. */ ng = getgrouplist (username, gid, g, &max_n_groups); + /* Some systems (like Darwin) have a bug where they + never increase max_n_groups. */ + if (ng < 0 && last_n_groups == max_n_groups) + max_n_groups *= 2; + if ((h = realloc_groupbuf (g, max_n_groups)) == NULL) { int saved_errno = errno; @@ -97,7 +103,9 @@ mgetgroups (char const *username, gid_t gid, GETGROUPS_T **groups) if (0 <= ng) { *groups = g; - return ng; + /* On success some systems just return 0 from getgrouplist, + so return max_n_groups rather than ng. */ + return max_n_groups; } } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 07f34ec45..8ce6a2118 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -171,6 +171,7 @@ TESTS = \ misc/head-c \ misc/head-pos \ misc/id-context \ + misc/id-groups \ misc/md5sum \ misc/md5sum-newline \ misc/mknod \ diff --git a/tests/misc/id-groups b/tests/misc/id-groups new file mode 100755 index 000000000..dc0f54c29 --- /dev/null +++ b/tests/misc/id-groups @@ -0,0 +1,28 @@ +#!/bin/sh +# Ensure that "id" outputs groups for a user +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if test "$VERBOSE" = yes; then + set -x + id --version +fi + +. $srcdir/test-lib.sh + +fail=0 +id -G $(id -nu) || fail=1 + +Exit $fail |