@@ -9,6 +9,9 @@ Version 2.39
Major new features:
+* Added group_member2 as a replacement for group_member which will return -1
+ on error and set errno.
+
* struct statvfs now has an f_type member, equal to the f_type statfs member;
on the Hurd this was always available under a reserved name,
and under Linux a spare has been allocated: it was always zero
@@ -131,6 +131,7 @@ extern __gid_t __getegid (void) attribute_hidden;
extern int __getgroups (int __size, __gid_t __list[]) attribute_hidden;
libc_hidden_proto (__getpgid)
extern int __group_member (__gid_t __gid) attribute_hidden;
+extern int __group_member2 (__gid_t __gid) attribute_hidden;
extern int __setuid (__uid_t __uid);
extern int __setreuid (__uid_t __ruid, __uid_t __euid);
extern int __setgid (__gid_t __gid);
@@ -294,6 +294,7 @@ tests := \
tst-glob_symlinks \
tst-gnuglob \
tst-gnuglob64 \
+ tst-group_member2 \
tst-mmap \
tst-mmap-offset \
tst-nanosleep \
@@ -159,6 +159,9 @@ libc {
GLIBC_2.35 {
posix_spawn_file_actions_addtcsetpgrp_np;
}
+ GLIBC_2.39 {
+ group_member2;
+ }
GLIBC_PRIVATE {
__libc_fork; __libc_pread; __libc_pwrite;
__nanosleep_nocancel; __pause_nocancel;
@@ -16,6 +16,8 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
+#include <errno.h>
+#include <scratch_buffer.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
@@ -47,3 +49,33 @@ __group_member (gid_t gid)
return 0;
}
weak_alias (__group_member, group_member)
+
+int
+__group_member2 (gid_t gid)
+{
+ int n;
+ gid_t *groups;
+ struct scratch_buffer buf;
+ scratch_buffer_init (&buf);
+
+ n = __getgroups (0, NULL);
+ if (!scratch_buffer_set_array_size (&buf, n, sizeof (*groups)))
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ groups = buf.data;
+
+ n = __getgroups (n, groups);
+
+ while (n-- > 0)
+ if (groups[n] == gid)
+ {
+ scratch_buffer_free (&buf);
+ return 1;
+ }
+
+ scratch_buffer_free (&buf);
+ return 0;
+}
+weak_alias (__group_member2, group_member2)
new file mode 100644
@@ -0,0 +1,42 @@
+/* Basic tests for group_memmber2.
+ Copyright (C) 2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <alloca.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <support/check.h>
+
+static int do_test (void)
+{
+ int n;
+ gid_t *groups;
+
+ n = getgroups (0, NULL);
+ groups = alloca (n * sizeof (*groups));
+ n = getgroups (n, groups);
+
+ while (n-- > 0)
+ TEST_COMPARE (1, group_member2 (groups[n]));
+
+ return EXIT_SUCCESS;
+}
+
+#include <support/test-driver.c>
+
@@ -713,6 +713,9 @@ extern int getgroups (int __size, __gid_t __list[]) __THROW __wur
#ifdef __USE_GNU
/* Return nonzero iff the calling process is in group GID. */
extern int group_member (__gid_t __gid) __THROW;
+/* Return nonzero iff the calling process is in group GID. Return
+ -1 on error and set errno. */
+extern int group_member2 (__gid_t __gid) __THROW;
#endif
/* Set the user ID of the calling process to UID.
@@ -2334,6 +2334,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.4 __confstr_chk F
GLIBC_2.4 __fgets_chk F
GLIBC_2.4 __fgets_unlocked_chk F
@@ -2114,6 +2114,7 @@ GLIBC_2.38 wprintf F
GLIBC_2.38 write F
GLIBC_2.38 writev F
GLIBC_2.38 wscanf F
+GLIBC_2.39 group_member2 F
HURD_CTHREADS_0.3 __cthread_getspecific F
HURD_CTHREADS_0.3 __cthread_keycreate F
HURD_CTHREADS_0.3 __cthread_setspecific F
@@ -2673,6 +2673,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2782,6 +2782,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2434,6 +2434,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -554,6 +554,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -551,6 +551,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2710,6 +2710,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2659,6 +2659,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2843,6 +2843,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2608,6 +2608,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2194,6 +2194,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -555,6 +555,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2786,6 +2786,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2759,6 +2759,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2756,6 +2756,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2751,6 +2751,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2749,6 +2749,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2757,6 +2757,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2659,6 +2659,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2798,6 +2798,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2180,6 +2180,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2825,6 +2825,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2858,6 +2858,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2579,6 +2579,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2893,6 +2893,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2436,6 +2436,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2636,6 +2636,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2823,6 +2823,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2616,6 +2616,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2666,6 +2666,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2663,6 +2663,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2818,6 +2818,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2631,6 +2631,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2582,6 +2582,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F
@@ -2688,6 +2688,7 @@ GLIBC_2.38 strlcat F
GLIBC_2.38 strlcpy F
GLIBC_2.38 wcslcat F
GLIBC_2.38 wcslcpy F
+GLIBC_2.39 group_member2 F
GLIBC_2.39 pidfd_getpid F
GLIBC_2.39 pidfd_spawn F
GLIBC_2.39 pidfd_spawnp F