From 4c08171ebd4395e358ec630306c1268473078046 Mon Sep 17 00:00:00 2001 From: Explorer09 Date: Thu, 3 Aug 2023 09:28:47 +0800 Subject: [PATCH] BSD platforms: Reject negative and zero KERN_FSCALE factors The "fscale" value, retrieved by sysctl() in BSD platforms, is used for computing CPU percentages of the processes. To prevent a division by zero, we should reject a zero "fscale" value. (A negative "fscale" value will not make sense either.) For DragonFlyBSD and FreeBSD, this would fall back to the hard-coded default scale. For NetBSD and OpenBSD, there is no hard-coded default value, so the zero or negative "fscale" is now a fatal error. Signed-off-by: Kang-Che Sung --- dragonflybsd/DragonFlyBSDMachine.c | 2 +- freebsd/FreeBSDMachine.c | 2 +- netbsd/NetBSDMachine.c | 2 +- openbsd/OpenBSDMachine.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dragonflybsd/DragonFlyBSDMachine.c b/dragonflybsd/DragonFlyBSDMachine.c index e1da417bd..04962d7c8 100644 --- a/dragonflybsd/DragonFlyBSDMachine.c +++ b/dragonflybsd/DragonFlyBSDMachine.c @@ -105,7 +105,7 @@ Machine* Machine_new(UsersTable* usersTable, uid_t userId) { } len = sizeof(this->kernelFScale); - if (sysctlbyname("kern.fscale", &this->kernelFScale, &len, NULL, 0) == -1) { + if (sysctlbyname("kern.fscale", &this->kernelFScale, &len, NULL, 0) == -1 || this->kernelFScale <= 0) { //sane default for kernel provided CPU percentage scaling, at least on x86 machines, in case this sysctl call failed this->kernelFScale = 2048; } diff --git a/freebsd/FreeBSDMachine.c b/freebsd/FreeBSDMachine.c index f5d228c82..d781414b4 100644 --- a/freebsd/FreeBSDMachine.c +++ b/freebsd/FreeBSDMachine.c @@ -136,7 +136,7 @@ Machine* Machine_new(UsersTable* usersTable, uid_t userId) { } len = sizeof(this->kernelFScale); - if (sysctlbyname("kern.fscale", &this->kernelFScale, &len, NULL, 0) == -1) { + if (sysctlbyname("kern.fscale", &this->kernelFScale, &len, NULL, 0) == -1 || this->kernelFScale <= 0) { //sane default for kernel provided CPU percentage scaling, at least on x86 machines, in case this sysctl call failed this->kernelFScale = 2048; } diff --git a/netbsd/NetBSDMachine.c b/netbsd/NetBSDMachine.c index 9f3b32de1..c1e6f7ed6 100644 --- a/netbsd/NetBSDMachine.c +++ b/netbsd/NetBSDMachine.c @@ -112,7 +112,7 @@ Machine* Machine_new(UsersTable* usersTable, uid_t userId) { NetBSDMachine_updateCPUcount(this); size = sizeof(this->fscale); - if (sysctl(fmib, 2, &this->fscale, &size, NULL, 0) < 0) { + if (sysctl(fmib, 2, &this->fscale, &size, NULL, 0) < 0 || this->fscale <= 0) { CRT_fatalError("fscale sysctl call failed"); } diff --git a/openbsd/OpenBSDMachine.c b/openbsd/OpenBSDMachine.c index 177e7d290..8b86dfab5 100644 --- a/openbsd/OpenBSDMachine.c +++ b/openbsd/OpenBSDMachine.c @@ -99,7 +99,7 @@ Machine* Machine_new(UsersTable* usersTable, uid_t userId) { OpenBSDProcessList_updateCPUcount(this); size = sizeof(this->fscale); - if (sysctl(fmib, 2, &this->fscale, &size, NULL, 0) < 0) { + if (sysctl(fmib, 2, &this->fscale, &size, NULL, 0) < 0 || this->fscale <= 0) { CRT_fatalError("fscale sysctl call failed"); }