bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS


From: Pádraig Brady
Subject: Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS
Date: Wed, 8 Apr 2009 10:55:59 +0100
User-agent: Thunderbird 2.0.0.6 (X11/20071008)

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?= <address@hidden>
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                      address@hidden
 Steve Ward                          address@hidden
 Steven G. Johnson                   address@hidden
 Steven Mocking                      address@hidden
+Steven Parkes                       address@hidden
 Steven Schveighoffer                address@hidden
 Steven P Watson                     address@hidden
 Stuart Kemp                         address@hidden
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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]