freebsd-nq/lib/libc
Kirk McKusick 8557409f20 In the C library, the setting up of the group array by various
utilities is done by calling gr_addgid() for each group to be
added (usually found by traversing /etc/group) then calling the
setgroups() system call after the group set has been created.
The gr_addgid() function (helpfully?) deduplicates the addition
of group members. So, if you call it to add a group member that
already exists, it is just dropped. Because group[0] is the
effective group-ID and is over-written when a setgid program
is run, The value in group[0] is usually duplicated so that
group value is not lost when a setgid program is run.

Historically this happened because the group value indicated
in the password file also appears in /etc/group (e.g., if you
are group staff in the password file, you will also appear in
the staff line in /etc/group). But, with the addition of the
deduplication, the attempt to add group staff was lost because
it already appeared in group[0]. So, the fix is to deduplicate
starting from group[1] which allows a duplicate of the entry in
group[0], but not in later entries.

There is some confusion about the setgroups system call because in
BSD it has (always) set the entire group including the egid group
(in group[0]). However, in Linux, it skips over group[0] and starts
setting from group[1]. See this comment from linux_setgroups:

      /*
       * cr_groups[0] holds egid. Setting the whole set from
       * the supplied set will cause egid to be changed too.
       * Keep cr_groups[0] unchanged to prevent that.
       */

To make it clear what the BSD setgroups system call does, I
added the following paragraph to the setgroups(2) manual page:

   The first entry of the group array (gidset[0]) is used as the effective
   group-ID for the process.  This entry is over-written when a setgid
   program is run.  To avoid losing access to the privileges of the
   gidset[0] entry, it should be duplicated later in the group array.
   By convention, this happens because the group value indicated in the
   password file also appears in /etc/group.  The group value in the
   password file is placed in gidset[0] and that value then gets added a
   second time when the /etc/group file is scanned to create the group set.

Reported by: Paul McMath  paulm at tetrardus.net
Reviewed by: kib
MFC after:   2 weeks
2018-01-23 22:18:45 +00:00
..
aarch64 Decrease relative branch brittleness. 2017-06-20 07:25:38 +00:00
amd64 libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
arm libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
capability Replace dot-dot relative pathing with SRCTOP-relative paths where possible 2017-01-20 03:23:24 +00:00
compat-43 General further adoption of SPDX licensing ID tags. 2017-11-20 19:49:47 +00:00
db libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
gdtoa libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
gen In the C library, the setting up of the group array by various 2018-01-23 22:18:45 +00:00
gmon General further adoption of SPDX licensing ID tags. 2017-11-20 19:49:47 +00:00
i386 revert r322589: force use of ld.bfd for linking i386 libc 2017-12-16 15:17:54 +00:00
iconv libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
include lib: Fix several typos and minor errors 2017-12-27 03:23:41 +00:00
inet SPDX: license IDs for some ISC-related files. 2017-12-08 15:57:29 +00:00
isc SPDX: more ISC-related files. 2017-12-08 17:52:53 +00:00
locale libc/locale: fix an off-by-one in newlocale 2017-12-29 14:56:46 +00:00
md Replace dot-dot relative pathing with SRCTOP-relative paths where possible 2017-01-20 03:23:24 +00:00
mips SPDX: Fix some License ID tags for libc. 2017-12-27 21:21:03 +00:00
nameser SPDX: license IDs for some ISC-related files. 2017-12-08 15:57:29 +00:00
net The source strings are from the password database which guarantees 2018-01-06 12:46:04 +00:00
nls Use current locale (f.e. set by thread). It was global locale always 2016-08-24 16:44:27 +00:00
posix1e libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
powerpc libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
powerpc64 libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
powerpcspe Correct an misunderstanding of MDSRCS. 2017-03-02 17:07:28 +00:00
quad General further adoption of SPDX licensing ID tags. 2017-11-20 19:49:47 +00:00
regex Add missing patch from r328240 2018-01-22 02:58:33 +00:00
resolv SPDX: license IDs for some ISC-related files. 2017-12-08 15:57:29 +00:00
riscv Support for v1.10 (latest) of RISC-V privilege specification. 2017-08-10 14:18:09 +00:00
rpc libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
secure libc: do not include <sys/types.h> where <sys/param.h> was already included 2016-04-18 21:05:15 +00:00
softfloat libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
sparc64 lib: Fix several typos and minor errors 2017-12-27 03:23:41 +00:00
stdio fsync(3): correctly document return values 2017-12-25 19:49:05 +00:00
stdlib libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
stdtime libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
string libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
sys In the C library, the setting up of the group array by various 2018-01-23 22:18:45 +00:00
tests Add libregex, connect it to the build 2018-01-22 02:44:41 +00:00
uuid libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
x86/sys Fix a regression in r321608. 2017-08-13 14:42:23 +00:00
xdr General further adoption of SPDX licensing ID tags. 2017-11-20 19:49:47 +00:00
yp libc: further adoption of SPDX licensing ID tags. 2017-11-25 17:12:48 +00:00
libc_nossp.ldscript Add different libc ldscript: the one without libssp -- 2016-10-12 13:19:21 +00:00
libc.ldscript
Makefile Support armv7 builds for userland 2017-10-05 23:01:33 +00:00
Makefile.depend DIRDEPS_BUILD: Regenerate without local dependencies. 2016-02-24 17:20:11 +00:00
Versions.def Create namespace for the symbols added during 12-CURRENT cycle. 2016-08-06 13:28:58 +00:00