Fix sysconf(_SC_NGROUPS_MAX).
The previous implementation wasn't wrong (it returned the "maximum
maximum"), but we can return the actual runtime value from the kernel.
Noticed while looking at initgroups().
Test: treehugger
Change-Id: I891fe4ff29bd82ee05d9e05ed8299d32c21abd7f
diff --git a/libc/bionic/sysconf.cpp b/libc/bionic/sysconf.cpp
index edbdef1..ff72b93 100644
--- a/libc/bionic/sysconf.cpp
+++ b/libc/bionic/sysconf.cpp
@@ -41,6 +41,16 @@
#include "platform/bionic/page.h"
#include "private/bionic_tls.h"
+static long __sysconf_fread_long(const char* path) {
+ long result = 0;
+ FILE* fp = fopen(path, "re");
+ if (fp != nullptr) {
+ fscanf(fp, "%ld", &result);
+ fclose(fp);
+ }
+ return result;
+}
+
struct sysconf_cache {
long size, assoc, linesize;
@@ -90,16 +100,6 @@
#else
-long __sysconf_fread_long(const char* path) {
- long result = 0;
- FILE* fp = fopen(path, "re");
- if (fp != nullptr) {
- fscanf(fp, "%ld", &result);
- fclose(fp);
- }
- return result;
-}
-
static sysconf_caches* __sysconf_caches() {
static sysconf_caches cached = []{
sysconf_caches info = {};
@@ -183,6 +183,7 @@
case _SC_AVPHYS_PAGES: return get_avphys_pages();
case _SC_CHILD_MAX: return __sysconf_rlimit(RLIMIT_NPROC);
case _SC_CLK_TCK: return static_cast<long>(getauxval(AT_CLKTCK));
+ case _SC_NGROUPS_MAX: return __sysconf_fread_long("/proc/sys/kernel/ngroups_max");
case _SC_NPROCESSORS_CONF: return get_nprocs_conf();
case _SC_NPROCESSORS_ONLN: return get_nprocs();
case _SC_OPEN_MAX: return __sysconf_rlimit(RLIMIT_NOFILE);
@@ -204,7 +205,6 @@
case _SC_COLL_WEIGHTS_MAX: return _POSIX2_COLL_WEIGHTS_MAX; // Minimum requirement.
case _SC_EXPR_NEST_MAX: return _POSIX2_EXPR_NEST_MAX; // Minimum requirement.
case _SC_LINE_MAX: return _POSIX2_LINE_MAX; // Minimum requirement.
- case _SC_NGROUPS_MAX: return NGROUPS_MAX;
case _SC_PASS_MAX: return PASS_MAX;
case _SC_2_C_BIND: return _POSIX2_C_BIND;
case _SC_2_C_DEV: return _POSIX2_C_DEV;