id,groups: with no user name, print only real and/or effective IDs,
authorJim Meyering <meyering@redhat.com>
Fri, 27 Apr 2012 11:28:32 +0000 (13:28 +0200)
committerJim Meyering <meyering@redhat.com>
Fri, 27 Apr 2012 17:54:03 +0000 (19:54 +0200)
commit032a549481444395558286b433296c97c09c721d
tree9fcec7e2cd465fc8a49130cb677d593bffb41bc5
parent8f6c5d43273de862dda88e9894486a82b75a804e
id,groups: with no user name, print only real and/or effective IDs,

... i.e., don't use the getpw* functions.

Before this change, running groups or id with no user name argument
would include a group name or ID from /etc/passwd.  Thus, under unusual
circumstances (default group is changed, but has not taken effect for a
given session), those programs could print a name or ID that is neither
real nor effective.

To demonstrate, run this:

    echo 'for i in 1 2; do id -G; sleep 1.5; done' \
      |su -s /bin/sh ftp - &
    sleep 1; perl -pi -e 's/^(ftp:x:\d+):(\d+)/$1:9876/' /etc/passwd

Those id -G commands printed the following:

    50
    50 9876

With this change, they print this:

    50
    50

Similarly, running those programs set-GID could make them
print one ID too many.

* src/group-list.c (print_group_list): When username is NULL, pass
egid, not getpwuid(ruid)->pw_gid), to xgetgroups, per the API
requirements of xgetgroups callee, mgetgroups.
When not using the password database, don't call getpwuid.
* NEWS (Bug fixes): Mention it.
* tests/misc/id-setgid: New file.
* tests/Makefile.am (TESTS): Add it.
(root_tests): It's a root-only test, so add it here, too.
Originally reported by Brynnen Owen as http://bugs.gnu.org/7320.
Raised again by Marc Mengel in http://bugzilla.redhat.com/816708.
NEWS
THANKS.in
src/group-list.c
tests/Makefile.am
tests/misc/id-setgid [new file with mode: 0755]