git: af7d105379a6 - main - sysctlbyname(): restore access to user variables
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 09 Feb 2022 22:10:42 UTC
The branch main has been updated by se:
URL: https://cgit.FreeBSD.org/src/commit/?id=af7d105379a649b7af4bffd15fbeab692bb52b69
commit af7d105379a649b7af4bffd15fbeab692bb52b69
Author: Stefan Eßer <se@FreeBSD.org>
AuthorDate: 2022-02-09 21:56:00 +0000
Commit: Stefan Eßer <se@FreeBSD.org>
CommitDate: 2022-02-09 22:10:31 +0000
sysctlbyname(): restore access to user variables
The optimization of sysctlbyname() in commit d05b53e0baee7 had the
side-effect of not going through the fix-up for the user.* variables
in the previously called sysctl() function.
This lead to 0 or an empty strings being returned by sysctlbyname()
for all user.* variables.
An alternate implementation would store the user variables in the
kernel during system start-up. That would allow to remove the fix-up
code in the C library that is currently required to provide the actual
values.
This update restores the previous code path for the user.* variables
and keeps the performance optimization intact for all other variables.
Approved by: mjg
Reviewed by: kaktus
Differential Revision: https://reviews.freebsd.org/D34171
---
lib/libc/gen/sysctlbyname.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/lib/libc/gen/sysctlbyname.c b/lib/libc/gen/sysctlbyname.c
index 9b4ffc0ca4ae..5086cc4b7d81 100644
--- a/lib/libc/gen/sysctlbyname.c
+++ b/lib/libc/gen/sysctlbyname.c
@@ -41,8 +41,17 @@ sysctlbyname(const char *name, void *oldp, size_t *oldlenp,
const void *newp, size_t newlen)
{
size_t len;
+ int oid[2];
- len = strlen(name);
- return (__sysctlbyname(name, len, oldp, oldlenp, newp,
- newlen));
+ if (__predict_true(strncmp(name, "user.", 5) != 0)) {
+ len = strlen(name);
+ return (__sysctlbyname(name, len, oldp, oldlenp, newp,
+ newlen));
+ } else {
+ len = nitems(oid);
+ if (sysctlnametomib(name, oid, &len) == -1)
+ return (-1);
+ return (sysctl(oid, (u_int)len, oldp, oldlenp, newp,
+ newlen));
+ }
}