* [PATCH v2 0/2] posix: Add group_member2 and deprecate group_member
@ 2023-10-13 15:10 Joe Simmons-Talbott
2023-10-13 15:10 ` [PATCH v2 1/2] posix/group_member: Add group_member2 with error return Joe Simmons-Talbott
2023-10-13 15:10 ` [PATCH v2 2/2] posix: Deprecate group_member for Linux Joe Simmons-Talbott
0 siblings, 2 replies; 7+ messages in thread
From: Joe Simmons-Talbott @ 2023-10-13 15:10 UTC (permalink / raw)
To: libc-alpha; +Cc: Joe Simmons-Talbott
Add group_member2 which uses a scratch_buffer rather than alloca and
returns -1 on error and sets errno. Deprecate group_member for Linux.
Joe Simmons-Talbott (2):
posix/group_member: Add group_member2 with error return.
posix: Deprecate group_member for Linux
NEWS | 7 +++-
include/unistd.h | 1 +
posix/Makefile | 4 ++
posix/Versions | 3 ++
posix/group_member.c | 32 ++++++++++++++
posix/group_member.h | 29 +++++++++++++
posix/tst-group_member.c | 41 ++++++++++++++++++
posix/tst-group_member2.c | 42 +++++++++++++++++++
posix/unistd.h | 6 +--
sysdeps/mach/hurd/i386/libc.abilist | 1 +
sysdeps/mach/hurd/x86_64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/aarch64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/alpha/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arc/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arm/be/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arm/le/libc.abilist | 1 +
sysdeps/unix/sysv/linux/csky/libc.abilist | 1 +
sysdeps/unix/sysv/linux/group_member.h | 30 +++++++++++++
sysdeps/unix/sysv/linux/hppa/libc.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libc.abilist | 1 +
sysdeps/unix/sysv/linux/ia64/libc.abilist | 1 +
.../sysv/linux/loongarch/lp64/libc.abilist | 1 +
.../sysv/linux/m68k/coldfire/libc.abilist | 1 +
.../unix/sysv/linux/m68k/m680x0/libc.abilist | 1 +
.../sysv/linux/microblaze/be/libc.abilist | 1 +
.../sysv/linux/microblaze/le/libc.abilist | 1 +
.../sysv/linux/mips/mips32/fpu/libc.abilist | 1 +
.../sysv/linux/mips/mips32/nofpu/libc.abilist | 1 +
.../sysv/linux/mips/mips64/n32/libc.abilist | 1 +
.../sysv/linux/mips/mips64/n64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/nios2/libc.abilist | 1 +
sysdeps/unix/sysv/linux/or1k/libc.abilist | 1 +
.../linux/powerpc/powerpc32/fpu/libc.abilist | 1 +
.../powerpc/powerpc32/nofpu/libc.abilist | 1 +
.../linux/powerpc/powerpc64/be/libc.abilist | 1 +
.../linux/powerpc/powerpc64/le/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv32/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv64/libc.abilist | 1 +
.../unix/sysv/linux/s390/s390-32/libc.abilist | 1 +
.../unix/sysv/linux/s390/s390-64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/sh/be/libc.abilist | 1 +
sysdeps/unix/sysv/linux/sh/le/libc.abilist | 1 +
.../sysv/linux/sparc/sparc32/libc.abilist | 1 +
.../sysv/linux/sparc/sparc64/libc.abilist | 1 +
.../unix/sysv/linux/x86_64/64/libc.abilist | 1 +
.../unix/sysv/linux/x86_64/x32/libc.abilist | 1 +
46 files changed, 227 insertions(+), 4 deletions(-)
create mode 100644 posix/group_member.h
create mode 100644 posix/tst-group_member.c
create mode 100644 posix/tst-group_member2.c
create mode 100644 sysdeps/unix/sysv/linux/group_member.h
--
2.39.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] posix/group_member: Add group_member2 with error return.
2023-10-13 15:10 [PATCH v2 0/2] posix: Add group_member2 and deprecate group_member Joe Simmons-Talbott
@ 2023-10-13 15:10 ` Joe Simmons-Talbott
2023-10-14 8:52 ` Florian Weimer
2023-10-13 15:10 ` [PATCH v2 2/2] posix: Deprecate group_member for Linux Joe Simmons-Talbott
1 sibling, 1 reply; 7+ messages in thread
From: Joe Simmons-Talbott @ 2023-10-13 15:10 UTC (permalink / raw)
To: libc-alpha; +Cc: Joe Simmons-Talbott
Because group_member doesn't return an error status and we are trying to
get rid of alloca usage. Add a new group_member2 which returns -1 and
sets errno on error. The old group_member will be deprecated in a later
change.
---
Changes to v1:
* Add NEWS entry
* Add group_member2 to posix/Versions
* Add group_member2 to libc.abilist for all architectures that
supported group_member.
NEWS | 3 ++
include/unistd.h | 1 +
posix/Makefile | 1 +
posix/Versions | 3 ++
posix/group_member.c | 32 ++++++++++++++
posix/tst-group_member2.c | 42 +++++++++++++++++++
posix/unistd.h | 3 ++
sysdeps/mach/hurd/i386/libc.abilist | 1 +
sysdeps/mach/hurd/x86_64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/aarch64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/alpha/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arc/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arm/be/libc.abilist | 1 +
sysdeps/unix/sysv/linux/arm/le/libc.abilist | 1 +
sysdeps/unix/sysv/linux/csky/libc.abilist | 1 +
sysdeps/unix/sysv/linux/hppa/libc.abilist | 1 +
sysdeps/unix/sysv/linux/i386/libc.abilist | 1 +
sysdeps/unix/sysv/linux/ia64/libc.abilist | 1 +
.../sysv/linux/loongarch/lp64/libc.abilist | 1 +
.../sysv/linux/m68k/coldfire/libc.abilist | 1 +
.../unix/sysv/linux/m68k/m680x0/libc.abilist | 1 +
.../sysv/linux/microblaze/be/libc.abilist | 1 +
.../sysv/linux/microblaze/le/libc.abilist | 1 +
.../sysv/linux/mips/mips32/fpu/libc.abilist | 1 +
.../sysv/linux/mips/mips32/nofpu/libc.abilist | 1 +
.../sysv/linux/mips/mips64/n32/libc.abilist | 1 +
.../sysv/linux/mips/mips64/n64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/nios2/libc.abilist | 1 +
sysdeps/unix/sysv/linux/or1k/libc.abilist | 1 +
.../linux/powerpc/powerpc32/fpu/libc.abilist | 1 +
.../powerpc/powerpc32/nofpu/libc.abilist | 1 +
.../linux/powerpc/powerpc64/be/libc.abilist | 1 +
.../linux/powerpc/powerpc64/le/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv32/libc.abilist | 1 +
.../unix/sysv/linux/riscv/rv64/libc.abilist | 1 +
.../unix/sysv/linux/s390/s390-32/libc.abilist | 1 +
.../unix/sysv/linux/s390/s390-64/libc.abilist | 1 +
sysdeps/unix/sysv/linux/sh/be/libc.abilist | 1 +
sysdeps/unix/sysv/linux/sh/le/libc.abilist | 1 +
.../sysv/linux/sparc/sparc32/libc.abilist | 1 +
.../sysv/linux/sparc/sparc64/libc.abilist | 1 +
.../unix/sysv/linux/x86_64/64/libc.abilist | 1 +
.../unix/sysv/linux/x86_64/x32/libc.abilist | 1 +
43 files changed, 121 insertions(+)
create mode 100644 posix/tst-group_member2.c
diff --git a/NEWS b/NEWS
index cc4b81f0ac..c15b0dd0f9 100644
--- a/NEWS
+++ b/NEWS
@@ -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
diff --git a/include/unistd.h b/include/unistd.h
index e241603b81..39d5bda372 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -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);
diff --git a/posix/Makefile b/posix/Makefile
index c36b9d981e..b46ff3259c 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -294,6 +294,7 @@ tests := \
tst-glob_symlinks \
tst-gnuglob \
tst-gnuglob64 \
+ tst-group_member2 \
tst-mmap \
tst-mmap-offset \
tst-nanosleep \
diff --git a/posix/Versions b/posix/Versions
index 3753810864..6221f3188e 100644
--- a/posix/Versions
+++ b/posix/Versions
@@ -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;
diff --git a/posix/group_member.c b/posix/group_member.c
index 22422b1f9f..6064eb7264 100644
--- a/posix/group_member.c
+++ b/posix/group_member.c
@@ -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)
diff --git a/posix/tst-group_member2.c b/posix/tst-group_member2.c
new file mode 100644
index 0000000000..4a360c71da
--- /dev/null
+++ b/posix/tst-group_member2.c
@@ -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>
+
diff --git a/posix/unistd.h b/posix/unistd.h
index 0477527a60..96816b186d 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -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.
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index 74a9f427b2..a4c1395f21 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -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
diff --git a/sysdeps/mach/hurd/x86_64/libc.abilist b/sysdeps/mach/hurd/x86_64/libc.abilist
index 24db98d765..3979469aff 100644
--- a/sysdeps/mach/hurd/x86_64/libc.abilist
+++ b/sysdeps/mach/hurd/x86_64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index b3484be555..d54d539e2b 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index 09c03b0e3f..55b838a4bd 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
index 63761315d0..d54234fdd2 100644
--- a/sysdeps/unix/sysv/linux/arc/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index d0860b25e0..da215847fc 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index b93819cab4..b57e59c469 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index ca5db5cde5..2f900aeba2 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index e736477ce6..8813eaa1fa 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index 56263a5111..3c57a007c4 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 504b6a7fa7..a564f4e05c 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
index 3cdc2b9d85..f8669a1005 100644
--- a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 1cbebfb162..65b4de7387 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 8dd696a24e..e4cb75bcad 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index ddfab38be7..7eaf9aa902 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index 88fd2a735f..5a7e25cfc4 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index 880e4f8bfd..b6b139ac87 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index 016f8fba79..29b2a65f75 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 0688873db5..19134fbfa1 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 0f0b10ccb1..1141910e03 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index c39db78ea8..4688368112 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
index 31b02d2a1e..113eba765f 100644
--- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
+++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index d23c6a0447..19c74cd099 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 6667852f18..00595a372b 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
index 3fb527362e..d20fd2ee7a 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
index 2c975dcad6..7de20f5f02 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
index a13c484582..ba875f12d2 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index cf65d8d6d4..5ab382e76b 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 3d78db8445..53f30b059e 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 030b26c376..50e560e930 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index 155b2c03ff..df708b9ef0 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index 1042622943..4084b4dd77 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index afa62cdbe6..e5618eaff3 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index 9e9df3876b..204b48898c 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 893f0886dd..5b9dc6d711 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -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
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index 9bcc1986a1..cb79dcaa3b 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -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
--
2.39.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] posix: Deprecate group_member for Linux
2023-10-13 15:10 [PATCH v2 0/2] posix: Add group_member2 and deprecate group_member Joe Simmons-Talbott
2023-10-13 15:10 ` [PATCH v2 1/2] posix/group_member: Add group_member2 with error return Joe Simmons-Talbott
@ 2023-10-13 15:10 ` Joe Simmons-Talbott
2023-10-13 15:53 ` Joseph Myers
1 sibling, 1 reply; 7+ messages in thread
From: Joe Simmons-Talbott @ 2023-10-13 15:10 UTC (permalink / raw)
To: libc-alpha; +Cc: Joe Simmons-Talbott
The alloca usage in group_member could lead to stack overflow on Linux.
Removing the alloca usage would require group_member to handle the error
condition where memory could not be allocated and that cannot be done
since group_member returns either 1 or 0 for found or not found
respectively. Thus deprecate group_member. Add a testcase.
---
Changes to v1:
* Add NEWS entry
NEWS | 4 ++-
posix/Makefile | 3 ++
posix/group_member.h | 29 ++++++++++++++++++
posix/tst-group_member.c | 41 ++++++++++++++++++++++++++
posix/unistd.h | 9 ++----
sysdeps/unix/sysv/linux/group_member.h | 30 +++++++++++++++++++
6 files changed, 109 insertions(+), 7 deletions(-)
create mode 100644 posix/group_member.h
create mode 100644 posix/tst-group_member.c
create mode 100644 sysdeps/unix/sysv/linux/group_member.h
diff --git a/NEWS b/NEWS
index c15b0dd0f9..0cfaf9c80a 100644
--- a/NEWS
+++ b/NEWS
@@ -43,7 +43,9 @@ Major new features:
Deprecated and removed features, and other changes affecting compatibility:
- [Add deprecations, removals and changes affecting compatibility here]
+* Deprecated group_member on Linux as it uses alloca to allocate a large
+ buffer and has no capability for indicating failure for other memory
+ allocations.
Changes to build and runtime requirements:
diff --git a/posix/Makefile b/posix/Makefile
index b46ff3259c..e24a05adbd 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -294,6 +294,7 @@ tests := \
tst-glob_symlinks \
tst-gnuglob \
tst-gnuglob64 \
+ tst-group_member \
tst-group_member2 \
tst-mmap \
tst-mmap-offset \
@@ -616,6 +617,8 @@ bug-glob1-ARGS = "$(objpfx)"
tst-execvp3-ARGS = --test-dir=$(objpfx)
CFLAGS-tst-spawn3.c += -DOBJPFX=\"$(objpfx)\"
+CFLAGS-tst-group_member.c += -Wno-error=deprecated-declarations
+
# Test voluntarily overflows struct dirent
CFLAGS-bug-glob2.c += $(no-fortify-source)
diff --git a/posix/group_member.h b/posix/group_member.h
new file mode 100644
index 0000000000..cc3c3ba603
--- /dev/null
+++ b/posix/group_member.h
@@ -0,0 +1,29 @@
+/* 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/>. */
+
+#ifndef _GROUP_MEMBER_H
+#define _GROUP_MEMBER_H 1
+
+#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
+
+#endif /* GROUP_MEMBER_H */
diff --git a/posix/tst-group_member.c b/posix/tst-group_member.c
new file mode 100644
index 0000000000..7f70841832
--- /dev/null
+++ b/posix/tst-group_member.c
@@ -0,0 +1,41 @@
+/* Basic tests for group_member.
+ 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_member(groups[n]));
+
+ return EXIT_SUCCESS;
+}
+
+#include <support/test-driver.c>
diff --git a/posix/unistd.h b/posix/unistd.h
index 96816b186d..d73a9eeea2 100644
--- a/posix/unistd.h
+++ b/posix/unistd.h
@@ -710,13 +710,10 @@ extern __gid_t getegid (void) __THROW;
of its supplementary groups in LIST and return the number written. */
extern int getgroups (int __size, __gid_t __list[]) __THROW __wur
__fortified_attr_access (__write_only__, 2, 1);
+
#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
+# include <group_member.h>
+#endif
/* Set the user ID of the calling process to UID.
If the calling process is the super-user, set the real
diff --git a/sysdeps/unix/sysv/linux/group_member.h b/sysdeps/unix/sysv/linux/group_member.h
new file mode 100644
index 0000000000..967b52df1b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/group_member.h
@@ -0,0 +1,30 @@
+/* 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/>. */
+
+#ifndef _GROUP_MEMBER_H
+#define _GROUP_MEMBER_H 1
+
+#ifdef __USE_GNU
+/* Return nonzero iff the calling process is in group GID. Deprecated */
+extern int group_member (__gid_t __gid) __THROW
+ __attribute_deprecated_msg__ ("may overflow the stack");
+/* 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
+
+#endif /* GROUP_MEMBER_H */
--
2.39.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] posix: Deprecate group_member for Linux
2023-10-13 15:10 ` [PATCH v2 2/2] posix: Deprecate group_member for Linux Joe Simmons-Talbott
@ 2023-10-13 15:53 ` Joseph Myers
2023-10-13 19:48 ` Joe Simmons-Talbott
0 siblings, 1 reply; 7+ messages in thread
From: Joseph Myers @ 2023-10-13 15:53 UTC (permalink / raw)
To: Joe Simmons-Talbott; +Cc: libc-alpha
On Fri, 13 Oct 2023, Joe Simmons-Talbott wrote:
> The alloca usage in group_member could lead to stack overflow on Linux.
> Removing the alloca usage would require group_member to handle the error
> condition where memory could not be allocated and that cannot be done
> since group_member returns either 1 or 0 for found or not found
> respectively. Thus deprecate group_member. Add a testcase.
I still don't expect this version to work with installed libc because it
doesn't add the new header to the headers list in posix/Makefile so it
won't be installed. And having a new installed header that's not in bits/
needs proper justification, which isn't provided in this commit message
(indeed seems completely unrelated to the commit summary).
> diff --git a/sysdeps/unix/sysv/linux/group_member.h b/sysdeps/unix/sysv/linux/group_member.h
> new file mode 100644
> index 0000000000..967b52df1b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/group_member.h
> @@ -0,0 +1,30 @@
> +/* Copyright (C) 2023 Free Software Foundation, Inc.
New files should have a summary description on their first line, before
the copyright notice.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] posix: Deprecate group_member for Linux
2023-10-13 15:53 ` Joseph Myers
@ 2023-10-13 19:48 ` Joe Simmons-Talbott
0 siblings, 0 replies; 7+ messages in thread
From: Joe Simmons-Talbott @ 2023-10-13 19:48 UTC (permalink / raw)
To: Joseph Myers; +Cc: libc-alpha
On Fri, Oct 13, 2023 at 03:53:35PM +0000, Joseph Myers wrote:
> On Fri, 13 Oct 2023, Joe Simmons-Talbott wrote:
>
> > The alloca usage in group_member could lead to stack overflow on Linux.
> > Removing the alloca usage would require group_member to handle the error
> > condition where memory could not be allocated and that cannot be done
> > since group_member returns either 1 or 0 for found or not found
> > respectively. Thus deprecate group_member. Add a testcase.
>
> I still don't expect this version to work with installed libc because it
> doesn't add the new header to the headers list in posix/Makefile so it
> won't be installed. And having a new installed header that's not in bits/
> needs proper justification, which isn't provided in this commit message
> (indeed seems completely unrelated to the commit summary).
>
> > diff --git a/sysdeps/unix/sysv/linux/group_member.h b/sysdeps/unix/sysv/linux/group_member.h
> > new file mode 100644
> > index 0000000000..967b52df1b
> > --- /dev/null
> > +++ b/sysdeps/unix/sysv/linux/group_member.h
> > @@ -0,0 +1,30 @@
> > +/* Copyright (C) 2023 Free Software Foundation, Inc.
>
> New files should have a summary description on their first line, before
> the copyright notice.
Thanks for the review. I've posted a v3 with these changes.
Thanks,
Joe
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] posix/group_member: Add group_member2 with error return.
2023-10-13 15:10 ` [PATCH v2 1/2] posix/group_member: Add group_member2 with error return Joe Simmons-Talbott
@ 2023-10-14 8:52 ` Florian Weimer
2023-10-16 16:47 ` Joe Simmons-Talbott
0 siblings, 1 reply; 7+ messages in thread
From: Florian Weimer @ 2023-10-14 8:52 UTC (permalink / raw)
To: Joe Simmons-Talbott; +Cc: libc-alpha
* Joe Simmons-Talbott:
> index 22422b1f9f..6064eb7264 100644
> --- a/posix/group_member.c
> +++ b/posix/group_member.c
> @@ -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)
This three-state return value (0/1/-1) is very difficult to deal with
for programmers, especially since we are coming from a boolean
interface. I'm not sure if this kind of interface is a good idea.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] posix/group_member: Add group_member2 with error return.
2023-10-14 8:52 ` Florian Weimer
@ 2023-10-16 16:47 ` Joe Simmons-Talbott
0 siblings, 0 replies; 7+ messages in thread
From: Joe Simmons-Talbott @ 2023-10-16 16:47 UTC (permalink / raw)
To: Florian Weimer; +Cc: libc-alpha
On Sat, Oct 14, 2023 at 10:52:25AM +0200, Florian Weimer wrote:
> * Joe Simmons-Talbott:
>
> > index 22422b1f9f..6064eb7264 100644
> > --- a/posix/group_member.c
> > +++ b/posix/group_member.c
> > @@ -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)
>
> This three-state return value (0/1/-1) is very difficult to deal with
> for programmers, especially since we are coming from a boolean
> interface. I'm not sure if this kind of interface is a good idea.
Okay. I'll post a new version of the deprecation only patch with the
changes Joseph suggested for group_member.h
Thanks,
Joe
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-10-16 16:48 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-13 15:10 [PATCH v2 0/2] posix: Add group_member2 and deprecate group_member Joe Simmons-Talbott
2023-10-13 15:10 ` [PATCH v2 1/2] posix/group_member: Add group_member2 with error return Joe Simmons-Talbott
2023-10-14 8:52 ` Florian Weimer
2023-10-16 16:47 ` Joe Simmons-Talbott
2023-10-13 15:10 ` [PATCH v2 2/2] posix: Deprecate group_member for Linux Joe Simmons-Talbott
2023-10-13 15:53 ` Joseph Myers
2023-10-13 19:48 ` Joe Simmons-Talbott
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).