[Top][All Lists]
[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
- inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Steven Parkes, 2009/04/07
- RE: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Steven Parkes, 2009/04/07
- Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS,
Pádraig Brady <=
- RE: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Steven Parkes, 2009/04/08
- Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Pádraig Brady, 2009/04/08
- RE: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Steven Parkes, 2009/04/08
- Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Jim Meyering, 2009/04/09
- Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Pádraig Brady, 2009/04/09
- Re: inifite loop in recent mgetgroups.c:mgetgroups on Darwin/MacOS, Jim Meyering, 2009/04/09