From b4a7d148b1065ff63e9be861f2866a25ec5ec327 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sun, 13 Feb 2022 12:07:51 -0700 Subject: [PATCH] Kernel: Expose maximum argument limit in sysconf Move the definitions for maximum argument and environment size to Process.h from execve.cpp. This allows sysconf(_SC_ARG_MAX) to return the actual argument maximum of 128 KiB to userspace. --- Kernel/API/POSIX/unistd.h | 2 ++ Kernel/Process.h | 2 ++ Kernel/Syscalls/execve.cpp | 7 ++----- Kernel/Syscalls/sysconf.cpp | 2 ++ 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Kernel/API/POSIX/unistd.h b/Kernel/API/POSIX/unistd.h index 30bbb6ffc9..58d4294d23 100644 --- a/Kernel/API/POSIX/unistd.h +++ b/Kernel/API/POSIX/unistd.h @@ -40,6 +40,7 @@ enum { _SC_CLK_TCK, _SC_SYMLOOP_MAX, _SC_MAPPED_FILES, + _SC_ARG_MAX, }; #define _SC_MONOTONIC_CLOCK _SC_MONOTONIC_CLOCK @@ -53,6 +54,7 @@ enum { #define _SC_CLK_TCK _SC_CLK_TCK #define _SC_SYMLOOP_MAX _SC_SYMLOOP_MAX #define _SC_MAPPED_FILES _SC_MAPPED_FILES +#define _SC_ARG_MAX _SC_ARG_MAX #ifdef __cplusplus } diff --git a/Kernel/Process.h b/Kernel/Process.h index ccf8478a45..2d138403b2 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -434,6 +434,8 @@ public: Custody* executable() { return m_executable.ptr(); } const Custody* executable() const { return m_executable.ptr(); } + static constexpr size_t max_arguments_size = Thread::default_userspace_stack_size / 8; + static constexpr size_t max_environment_size = Thread::default_userspace_stack_size / 8; NonnullOwnPtrVector const& arguments() const { return m_arguments; }; NonnullOwnPtrVector const& environment() const { return m_environment; }; diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index 85fbb20e5e..c7123dfc7b 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -58,13 +58,10 @@ static bool validate_stack_size(NonnullOwnPtrVector const& arguments, N total_arguments_size += sizeof(char*) * (arguments.size() + 1); total_environment_size += sizeof(char*) * (environment.size() + 1); - constexpr size_t max_arguments_size = Thread::default_userspace_stack_size / 8; - constexpr size_t max_environment_size = Thread::default_userspace_stack_size / 8; - - if (total_arguments_size > max_arguments_size) + if (total_arguments_size > Process::max_arguments_size) return false; - if (total_environment_size > max_environment_size) + if (total_environment_size > Process::max_environment_size) return false; // FIXME: This doesn't account for the size of the auxiliary vector diff --git a/Kernel/Syscalls/sysconf.cpp b/Kernel/Syscalls/sysconf.cpp index b7a82d73d4..bed043c493 100644 --- a/Kernel/Syscalls/sysconf.cpp +++ b/Kernel/Syscalls/sysconf.cpp @@ -33,6 +33,8 @@ ErrorOr Process::sys$sysconf(int name) return TimeManagement::the().ticks_per_second(); case _SC_SYMLOOP_MAX: return Kernel::VirtualFileSystem::symlink_recursion_limit; + case _SC_ARG_MAX: + return Process::max_arguments_size; default: return EINVAL; }