From d769892ad08451267e615efa6b67f86a9e267236 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 1 Jul 2026 11:03:19 +0200 Subject: [PATCH 1/4] env-util: use our own sc_arg_max() helper at more places --- src/basic/env-util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/env-util.c b/src/basic/env-util.c index 934428e7f5..4f677565e9 100644 --- a/src/basic/env-util.c +++ b/src/basic/env-util.c @@ -555,7 +555,7 @@ char* strv_env_get_n(char * const *l, const char *name, size_t k, ReplaceEnvFlag const char *t; /* Safety check that the name is not overly long, before we do a stack allocation */ - if (k > (size_t) sysconf(_SC_ARG_MAX) - 2) + if (k > sc_arg_max() - 2) return NULL; t = strndupa_safe(name, k); From 60bac209eb9fcfb5c305114d6382c580469f4b0f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 1 Jul 2026 11:04:11 +0200 Subject: [PATCH 2/4] memory-util: don't use 'r' for non-int returns --- src/basic/memory-util.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/basic/memory-util.c b/src/basic/memory-util.c index e091cfb8f1..f03ed7adbb 100644 --- a/src/basic/memory-util.c +++ b/src/basic/memory-util.c @@ -8,15 +8,14 @@ size_t page_size(void) { static thread_local size_t pgsz = 0; - long r; if (_likely_(pgsz > 0)) return pgsz; - r = sysconf(_SC_PAGESIZE); - assert(r > 0); + long p = sysconf(_SC_PAGESIZE); + assert(p > 0); - pgsz = (size_t) r; + pgsz = (size_t) p; return pgsz; } From 818b3b31e67349d8c9d4340b02661df04b5edcaf Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 1 Jul 2026 11:05:27 +0200 Subject: [PATCH 3/4] time-util: use sysconf_clock_ticks_cached() at all places we query _SC_CLK_TCK --- src/basic/procfs-util.c | 10 +++------- src/basic/time-util.c | 19 +++++++++---------- src/basic/time-util.h | 2 ++ 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/basic/procfs-util.c b/src/basic/procfs-util.c index eaa36e3921..9ddffe2d37 100644 --- a/src/basic/procfs-util.c +++ b/src/basic/procfs-util.c @@ -131,7 +131,6 @@ int procfs_cpu_get_usage(nsec_t *ret) { _cleanup_free_ char *first_line = NULL; unsigned long user_ticks, nice_ticks, system_ticks, irq_ticks, softirq_ticks, guest_ticks = 0, guest_nice_ticks = 0; - long ticks_per_second; uint64_t sum, gcd, a, b; const char *p; int r; @@ -156,10 +155,7 @@ int procfs_cpu_get_usage(nsec_t *ret) { &guest_nice_ticks) < 5) /* we only insist on the first five fields */ return -EINVAL; - ticks_per_second = sysconf(_SC_CLK_TCK); - if (ticks_per_second < 0) - return -errno; - assert(ticks_per_second > 0); + uint64_t ticks_per_second = sysconf_clock_ticks_cached(); sum = (uint64_t) user_ticks + (uint64_t) nice_ticks + (uint64_t) system_ticks + (uint64_t) irq_ticks + (uint64_t) softirq_ticks + @@ -168,8 +164,8 @@ int procfs_cpu_get_usage(nsec_t *ret) { /* Let's reduce this fraction before we apply it to avoid overflows when converting this to μsec */ gcd = calc_gcd64(NSEC_PER_SEC, ticks_per_second); - a = (uint64_t) NSEC_PER_SEC / gcd; - b = (uint64_t) ticks_per_second / gcd; + a = NSEC_PER_SEC / gcd; + b = ticks_per_second / gcd; *ret = DIV_ROUND_UP((nsec_t) sum * (nsec_t) a, (nsec_t) b); return 0; diff --git a/src/basic/time-util.c b/src/basic/time-util.c index eb74de32c2..93173c4d91 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -1766,27 +1766,26 @@ int localtime_or_gmtime_usec( return 0; } -static uint32_t sysconf_clock_ticks_cached(void) { - static thread_local uint32_t hz = 0; - long r; +uint64_t sysconf_clock_ticks_cached(void) { + static thread_local uint64_t hz = 0; - if (hz == 0) { - r = sysconf(_SC_CLK_TCK); + if (hz != 0) + return hz; - assert(r > 0); - hz = r; - } + long t = sysconf(_SC_CLK_TCK); + assert(t > 0); + hz = (uint64_t) t; return hz; } uint32_t usec_to_jiffies(usec_t u) { - uint32_t hz = sysconf_clock_ticks_cached(); + uint64_t hz = sysconf_clock_ticks_cached(); return DIV_ROUND_UP(u, USEC_PER_SEC / hz); } usec_t jiffies_to_usec(uint32_t j) { - uint32_t hz = sysconf_clock_ticks_cached(); + uint64_t hz = sysconf_clock_ticks_cached(); return DIV_ROUND_UP(j * USEC_PER_SEC, hz); } diff --git a/src/basic/time-util.h b/src/basic/time-util.h index fdaf11edcb..fb0aab3ff5 100644 --- a/src/basic/time-util.h +++ b/src/basic/time-util.h @@ -201,6 +201,8 @@ static inline int parse_birth_date(const char *s, struct tm *ret) { return parse_calendar_date_full(s, /* allow_pre_epoch= */ true, NULL, ret); } +uint64_t sysconf_clock_ticks_cached(void); + uint32_t usec_to_jiffies(usec_t usec); usec_t jiffies_to_usec(uint32_t jiffies); From 7f9b1da527a15c8e805f4b6380bebc0db8a5b1ba Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 1 Jul 2026 11:06:22 +0200 Subject: [PATCH 4/4] tree-wide: fix return type of sysconf() --- src/core/exec-invoke.c | 2 +- src/test/test-condition.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index 6fea347e4c..74602efc52 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -922,7 +922,7 @@ static int get_supplementary_groups( * be positive, otherwise fail. */ errno = 0; - int ngroups_max = (int) sysconf(_SC_NGROUPS_MAX); + long ngroups_max = sysconf(_SC_NGROUPS_MAX); if (ngroups_max <= 0) return errno_or_else(EOPNOTSUPP); diff --git a/src/test/test-condition.c b/src/test/test-condition.c index a4c57dc197..8674dab488 100644 --- a/src/test/test-condition.c +++ b/src/test/test-condition.c @@ -1037,7 +1037,8 @@ TEST(condition_test_group) { Condition *condition; char gid[DECIMAL_STR_MAX(uint32_t)]; gid_t *gids, max_gid; - int ngroups_max, ngroups, r, i; + int ngroups, r, i; + long ngroups_max; xsprintf(gid, "%u", UINT32_C(0xFFFF)); ASSERT_NOT_NULL((condition = condition_new(CONDITION_GROUP, gid, false, false)));