[libc-commits] [libc] e226b9e - [libc] Restrict sysconf/confstr to full-build mode. (#223103)
via libc-commits
libc-commits at lists.llvm.org
Mon Sep 14 10:47:39 PDT 2026
Author: Alexey Samsonov
Date: 2026-09-14T10:47:34-07:00
New Revision: e226b9ea3e4c2e87ab36209f3c1dd83faa98e429
URL: https://github.com/llvm/llvm-project/commit/e226b9ea3e4c2e87ab36209f3c1dd83faa98e429
DIFF: https://github.com/llvm/llvm-project/commit/e226b9ea3e4c2e87ab36209f3c1dd83faa98e429.diff
LOG: [libc] Restrict sysconf/confstr to full-build mode. (#223103)
`sysconf` (and its sibling `confstr`) from `<unistd.h>` return some
values specific to the kernel/environment,
and some values specific to the system library (e.g. features available
in system library's pthread implementation).
Using LLVM-libc sysconf in overlay mode is inherently problematic - we
don't know what features host libc has,
and trying to reverse-engineer it would be brittle. Since we include
host libc's `<unistd.h>`, we can't even know in
advance what `_SC_` values or what macros would be available there, so
the portable implementation of `sysconf`
will be convoluted, and there's little benefits to it anyway.
Conversely, making sure that our `sysconf` implementation only compiles
against LLVM-libc's own headers will allow
us to precisely handle macro / features that we know are available /
supported.
Migrate four tests from sys/mman.h to use `getpagesize()` function
instead of generic `sysconf` to ensure those
tests won't be auto-excluded in overlay mode.
Remove the workarounds for overlay-mode added to sysconf(), since those
are no longer needed.
Added:
Modified:
libc/config/linux/aarch64/entrypoints.txt
libc/config/linux/arm/entrypoints.txt
libc/config/linux/riscv/entrypoints.txt
libc/config/linux/x86_64/entrypoints.txt
libc/src/unistd/linux/sysconf.cpp
libc/test/src/sys/mman/linux/CMakeLists.txt
libc/test/src/sys/mman/linux/mincore_test.cpp
libc/test/src/sys/mman/linux/mlock_test.cpp
libc/test/src/sys/mman/linux/msync_test.cpp
libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
utils/bazel/llvm-project-overlay/libc/BUILD.bazel
utils/bazel/llvm-project-overlay/libc/test/src/sys/mman/BUILD.bazel
Removed:
################################################################################
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index a96057944af75..fd931e7a0a615 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -408,7 +408,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.chdir
libc.src.unistd.chown
libc.src.unistd.chroot
- libc.src.unistd.confstr
libc.src.unistd.close
libc.src.unistd.dup
libc.src.unistd.dup2
@@ -458,7 +457,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.sleep
libc.src.unistd.symlink
libc.src.unistd.symlinkat
- libc.src.unistd.sysconf
libc.src.unistd.tcgetpgrp
libc.src.unistd.tcsetpgrp
libc.src.unistd.truncate
@@ -1383,6 +1381,7 @@ if(LLVM_LIBC_FULL_BUILD)
# unistd.h entrypoints
libc.src.unistd.__llvm_libc_syscall
libc.src.unistd._exit
+ libc.src.unistd.confstr
libc.src.unistd.environ
libc.src.unistd.execl
libc.src.unistd.execv
@@ -1393,6 +1392,7 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.unistd.optind
libc.src.unistd.optopt
libc.src.unistd.swab
+ libc.src.unistd.sysconf
# sys/select.h entrypoints
libc.src.sys.select.select
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index a3f387edc349b..e32430cac7c8c 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -234,7 +234,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.chdir
libc.src.unistd.chown
libc.src.unistd.chroot
- libc.src.unistd.confstr
libc.src.unistd.close
libc.src.unistd.dup
libc.src.unistd.dup2
@@ -278,7 +277,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.setuid
libc.src.unistd.symlink
libc.src.unistd.symlinkat
- libc.src.unistd.sysconf
libc.src.unistd.tcgetpgrp
libc.src.unistd.tcsetpgrp
libc.src.unistd.truncate
@@ -320,6 +318,10 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.dirent.opendir
libc.src.dirent.readdir
libc.src.dirent.fdopendir
+
+ # unistd.h entrypoints
+ libc.src.unistd.confstr
+ libc.src.unistd.sysconf
)
endif()
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 4b2f6e2e72120..2525202d4ff10 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -438,7 +438,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.chdir
libc.src.unistd.chown
libc.src.unistd.chroot
- libc.src.unistd.confstr
libc.src.unistd.close
libc.src.unistd.dup
libc.src.unistd.dup2
@@ -488,7 +487,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.sleep
libc.src.unistd.symlink
libc.src.unistd.symlinkat
- libc.src.unistd.sysconf
libc.src.unistd.tcgetpgrp
libc.src.unistd.tcsetpgrp
libc.src.unistd.truncate
@@ -1593,6 +1591,7 @@ if(LLVM_LIBC_FULL_BUILD)
# unistd.h entrypoints
libc.src.unistd.__llvm_libc_syscall
libc.src.unistd._exit
+ libc.src.unistd.confstr
libc.src.unistd.environ
libc.src.unistd.execl
libc.src.unistd.execv
@@ -1603,6 +1602,7 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.unistd.optind
libc.src.unistd.optopt
libc.src.unistd.swab
+ libc.src.unistd.sysconf
# sys/select.h entrypoints
libc.src.sys.select.select
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index c4856700e9ea8..42cbcd02513eb 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -447,7 +447,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.chdir
libc.src.unistd.chown
libc.src.unistd.chroot
- libc.src.unistd.confstr
libc.src.unistd.close
libc.src.unistd.dup
libc.src.unistd.dup2
@@ -497,7 +496,6 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.sleep
libc.src.unistd.symlink
libc.src.unistd.symlinkat
- libc.src.unistd.sysconf
libc.src.unistd.tcgetpgrp
libc.src.unistd.tcsetpgrp
libc.src.unistd.truncate
@@ -1608,6 +1606,7 @@ if(LLVM_LIBC_FULL_BUILD)
# unistd.h entrypoints
libc.src.unistd.__llvm_libc_syscall
libc.src.unistd._exit
+ libc.src.unistd.confstr
libc.src.unistd.environ
libc.src.unistd.execl
libc.src.unistd.execv
@@ -1618,6 +1617,7 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.unistd.optind
libc.src.unistd.optopt
libc.src.unistd.swab
+ libc.src.unistd.sysconf
# sys/select.h entrypoints
libc.src.sys.select.select
diff --git a/libc/src/unistd/linux/sysconf.cpp b/libc/src/unistd/linux/sysconf.cpp
index a4e9afc8d38f0..b4b3927f78b86 100644
--- a/libc/src/unistd/linux/sysconf.cpp
+++ b/libc/src/unistd/linux/sysconf.cpp
@@ -28,13 +28,6 @@
#include "src/__support/macros/config.h"
#include <linux/limits.h>
-// In overlay mode, system headers (like glibc's <bits/local_lim.h>) may
-// explicitly undefine ARG_MAX to indicate it is dynamic. We define a fallback
-// here using the standard Linux kernel minimum floor of 128KB.
-#ifndef ARG_MAX
-#define ARG_MAX 131072
-#endif
-
namespace LIBC_NAMESPACE_DECL {
namespace { // Anonymous namespace for internal helpers
@@ -45,17 +38,9 @@ namespace { // Anonymous namespace for internal helpers
constexpr long DEFAULT_STACK_LIMIT = 8 * 1024 * 1024; // 8MB
constexpr long ARG_MAX_FALLBACK = DEFAULT_STACK_LIMIT / 4 * 3; // 6MB
-// We define a local structure for prlimit64 to avoid type mismatches
-// and stack corruption on 32-bit systems when in overlay mode.
-struct rlimit64 {
- uint64_t rlim_cur;
- uint64_t rlim_max;
-};
-
long get_arg_max() {
- struct rlimit64 limits;
- ErrorOr<int> ret = linux_syscalls::prlimit(
- 0, RLIMIT_STACK, nullptr, reinterpret_cast<struct rlimit *>(&limits));
+ struct rlimit limits;
+ ErrorOr<int> ret = linux_syscalls::prlimit(0, RLIMIT_STACK, nullptr, &limits);
if (!ret) {
libc_errno = -ret.error();
return -1;
@@ -68,9 +53,9 @@ long get_arg_max() {
}
long get_open_max() {
- struct rlimit64 limits;
- ErrorOr<int> ret = linux_syscalls::prlimit(
- 0, RLIMIT_NOFILE, nullptr, reinterpret_cast<struct rlimit *>(&limits));
+ struct rlimit limits;
+ ErrorOr<int> ret =
+ linux_syscalls::prlimit(0, RLIMIT_NOFILE, nullptr, &limits);
if (!ret) {
libc_errno = -ret.error();
return -1;
diff --git a/libc/test/src/sys/mman/linux/CMakeLists.txt b/libc/test/src/sys/mman/linux/CMakeLists.txt
index 9ff38de9525d1..cc031441df31c 100644
--- a/libc/test/src/sys/mman/linux/CMakeLists.txt
+++ b/libc/test/src/sys/mman/linux/CMakeLists.txt
@@ -132,7 +132,7 @@ add_libc_test(
libc.src.sys.mman.mincore
libc.src.sys.mman.mlock
libc.src.sys.mman.munlock
- libc.src.unistd.sysconf
+ libc.src.unistd.getpagesize
libc.test.UnitTest.ErrnoCheckingTest
libc.test.UnitTest.ErrnoSetterMatcher
)
@@ -159,7 +159,7 @@ add_libc_test(
libc.src.sys.mman.munlockall
libc.hdr.sys_resource_macros
libc.src.sys.resource.getrlimit
- libc.src.unistd.sysconf
+ libc.src.unistd.getpagesize
libc.src.__support.OSUtil.osutil
libc.test.UnitTest.ErrnoCheckingTest
libc.test.UnitTest.ErrnoSetterMatcher
@@ -182,7 +182,7 @@ add_libc_test(
libc.src.sys.mman.mincore
libc.src.sys.mman.mlock
libc.src.sys.mman.munlock
- libc.src.unistd.sysconf
+ libc.src.unistd.getpagesize
libc.test.UnitTest.ErrnoCheckingTest
libc.test.UnitTest.ErrnoSetterMatcher
)
@@ -209,7 +209,7 @@ else()
libc.src.sys.mman.munmap
libc.src.fcntl.open
libc.src.unistd.close
- libc.src.unistd.sysconf
+ libc.src.unistd.getpagesize
)
endif()
diff --git a/libc/test/src/sys/mman/linux/mincore_test.cpp b/libc/test/src/sys/mman/linux/mincore_test.cpp
index fbbe6d6b00d2f..e328f054412d0 100644
--- a/libc/test/src/sys/mman/linux/mincore_test.cpp
+++ b/libc/test/src/sys/mman/linux/mincore_test.cpp
@@ -13,7 +13,7 @@
#include "src/sys/mman/mmap.h"
#include "src/sys/mman/munlock.h"
#include "src/sys/mman/munmap.h"
-#include "src/unistd/sysconf.h"
+#include "src/unistd/getpagesize.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
@@ -22,7 +22,7 @@ using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
using LlvmLibcMincoreTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
-const size_t PAGE_SIZE = LIBC_NAMESPACE::sysconf(_SC_PAGESIZE);
+const size_t PAGE_SIZE = LIBC_NAMESPACE::getpagesize();
TEST_F(LlvmLibcMincoreTest, UnMappedMemory) {
unsigned char vec;
diff --git a/libc/test/src/sys/mman/linux/mlock_test.cpp b/libc/test/src/sys/mman/linux/mlock_test.cpp
index b166dc789f343..526fd36b51827 100644
--- a/libc/test/src/sys/mman/linux/mlock_test.cpp
+++ b/libc/test/src/sys/mman/linux/mlock_test.cpp
@@ -24,14 +24,14 @@
#include "src/sys/mman/munlockall.h"
#include "src/sys/mman/munmap.h"
#include "src/sys/resource/getrlimit.h"
-#include "src/unistd/sysconf.h"
+#include "src/unistd/getpagesize.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
#include <sys/syscall.h>
-const size_t PAGE_SIZE = LIBC_NAMESPACE::sysconf(_SC_PAGESIZE);
+const size_t PAGE_SIZE = LIBC_NAMESPACE::getpagesize();
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
using LlvmLibcMlockTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
diff --git a/libc/test/src/sys/mman/linux/msync_test.cpp b/libc/test/src/sys/mman/linux/msync_test.cpp
index 7a9bab25be325..24b3668b6e891 100644
--- a/libc/test/src/sys/mman/linux/msync_test.cpp
+++ b/libc/test/src/sys/mman/linux/msync_test.cpp
@@ -12,12 +12,12 @@
#include "src/sys/mman/msync.h"
#include "src/sys/mman/munlock.h"
#include "src/sys/mman/munmap.h"
-#include "src/unistd/sysconf.h"
+#include "src/unistd/getpagesize.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
-const size_t PAGE_SIZE = LIBC_NAMESPACE::sysconf(_SC_PAGESIZE);
+const size_t PAGE_SIZE = LIBC_NAMESPACE::getpagesize();
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
using LlvmLibcMsyncTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
diff --git a/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp b/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
index 7d3f89440043d..70e5621754ae6 100644
--- a/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
+++ b/libc/test/src/sys/mman/linux/remap_file_pages_test.cpp
@@ -13,12 +13,12 @@
#include "src/sys/mman/munmap.h"
#include "src/sys/mman/remap_file_pages.h"
#include "src/unistd/close.h"
-#include "src/unistd/sysconf.h"
+#include "src/unistd/getpagesize.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
-const size_t PAGE_SIZE = LIBC_NAMESPACE::sysconf(_SC_PAGESIZE);
+const size_t PAGE_SIZE = LIBC_NAMESPACE::getpagesize();
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index c0290a50de683..2004a67ef1017 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -16943,6 +16943,10 @@ libc_function(
name = "sysconf",
srcs = ["src/unistd/linux/sysconf.cpp"],
hdrs = ["src/unistd/sysconf.h"],
+ target_compatible_with = select({
+ ":full_build_linux": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+ }),
deps = [
":__support_common",
":__support_libc_errno",
diff --git a/utils/bazel/llvm-project-overlay/libc/test/src/sys/mman/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/test/src/sys/mman/BUILD.bazel
index 0b3e1fa9d4be6..20e881b50fbfe 100644
--- a/utils/bazel/llvm-project-overlay/libc/test/src/sys/mman/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/test/src/sys/mman/BUILD.bazel
@@ -25,6 +25,7 @@ libc_test(
name = "mincore_test",
srcs = ["linux/mincore_test.cpp"],
deps = [
+ "//libc:getpagesize",
"//libc:hdr_sys_mman_macros",
"//libc:madvise",
"//libc:mincore",
@@ -32,7 +33,6 @@ libc_test(
"//libc:mmap",
"//libc:munlock",
"//libc:munmap",
- "//libc:sysconf",
],
)
@@ -41,6 +41,7 @@ libc_test(
srcs = ["linux/mlock_test.cpp"],
deps = [
"//libc:__support_osutil_syscall",
+ "//libc:getpagesize",
"//libc:getrlimit",
"//libc:hdr_sys_mman_macros",
"//libc:hdr_sys_resource_macros",
@@ -53,7 +54,6 @@ libc_test(
"//libc:munlock",
"//libc:munlockall",
"//libc:munmap",
- "//libc:sysconf",
],
)
@@ -97,13 +97,13 @@ libc_test(
name = "msync_test",
srcs = ["linux/msync_test.cpp"],
deps = [
+ "//libc:getpagesize",
"//libc:hdr_sys_mman_macros",
"//libc:mlock",
"//libc:mmap",
"//libc:msync",
"//libc:munlock",
"//libc:munmap",
- "//libc:sysconf",
],
)
@@ -142,13 +142,13 @@ libc_test(
srcs = ["linux/remap_file_pages_test.cpp"],
deps = [
"//libc:close",
+ "//libc:getpagesize",
"//libc:hdr_sys_mman_macros",
"//libc:hdr_sys_stat_macros",
"//libc:mmap",
"//libc:munmap",
"//libc:open",
"//libc:remap_file_pages",
- "//libc:sysconf",
],
)
More information about the libc-commits
mailing list