Steven Parkes wrote:
> Sorry; that patch was bogus. This one is not, though I still don't like that
> it returns the wrong result:
> 
> diff --git a/gl/lib/mgetgroups.c b/gl/lib/mgetgroups.c
> index e697013..b3a2a1a 100644
> --- a/gl/lib/mgetgroups.c
> +++ b/gl/lib/mgetgroups.c
> @@ -94,6 +94,11 @@ mgetgroups (char const *username, gid_t gid, GETGROUPS_T
> **groups)
>             }
>           g = h;
>  
> +          if (ng < 0 && max_n_groups <= N_GROUPS_INIT)
> +            {
> +                ng = max_n_groups;
> +            }
> +
>           if (0 <= ng)
>             {
>               *groups = g;

Sorry about that. It certainly seems like a bug in Darwin:
http://developer.apple.com/DOCUMENTATION/DARWIN/Reference/ManPages/man3/getgrouplist.3.html
Has anyone reported it to the Darwin guys?

Note the old code was also buggy in that it always
returned <= 10 groups on Darwin.

Could you try out the attached?
I've not got any access to netbsd or darwin systems to test unfortunately.

cheers,
Pádraig.

>From 7e609326db2c19d18fd22d06dba3a768e80b24a5 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?P=C3=A1draig=20Brady?= <[email protected]>
Date: Wed, 8 Apr 2009 10:43:15 +0100
Subject: [PATCH] id: fix infinite loop on some systems

Steven Parkes reported that `id -G $USER` went into an infinite loop
on Darwin systems: http://bugs.gentoo.org/show_bug.cgi?id=264007
* gl/lib/mgetgroups.c: Work around the Darwin bug by doubling
the result buffer on each iteration.
* tests/misc/id-groups: Add test to exercise this logic
* tests/Makefile.am: Reference new test
* THANKS: Update
---
 THANKS               |    1 +
 gl/lib/mgetgroups.c  |    6 ++++++
 tests/Makefile.am    |    1 +
 tests/misc/id-groups |   28 ++++++++++++++++++++++++++++
 4 files changed, 36 insertions(+), 0 deletions(-)
 create mode 100755 tests/misc/id-groups

diff --git a/THANKS b/THANKS
index 6a918a4..fe523fe 100644
--- a/THANKS
+++ b/THANKS
@@ -525,6 +525,7 @@ Steve McIntyre                      [email protected]
 Steve Ward                          [email protected]
 Steven G. Johnson                   [email protected]
 Steven Mocking                      [email protected]
+Steven Parkes                       [email protected]
 Steven Schveighoffer                [email protected]
 Steven P Watson                     [email protected]
 Stuart Kemp                         [email protected]
diff --git a/gl/lib/mgetgroups.c b/gl/lib/mgetgroups.c
index e697013..feb832b 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 ((0 > ng) && (last_n_groups == max_n_groups))
+	    max_n_groups *= 2;
+
 	  if ((h = realloc_groupbuf (g, max_n_groups)) == NULL)
 	    {
 	      int saved_errno = errno;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 07f34ec..8ce6a21 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 0000000..dc0f54c
--- /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
-- 
1.5.3.6

_______________________________________________
Bug-coreutils mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-coreutils

Reply via email to