]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
libc: return partial sysctl() result if buffer is too small
authorStefan Eßer <se@FreeBSD.org>
Fri, 4 Feb 2022 12:44:20 +0000 (13:44 +0100)
committerStefan Eßer <se@FreeBSD.org>
Fri, 4 Mar 2022 19:54:00 +0000 (20:54 +0100)
commit23fe1083ca8cd10d28d057cfa558c28bb3bf19d3
tree37a029f00e06b9f2f76355a82cf9c9b81b57eca0
parente53bb68f4cf10bfb2dcaf6d76bc43a2975025369
libc: return partial sysctl() result if buffer is too small

Testing of a new feature revealed that calling sysctl() to retrieve
the value of the user.localbase variable passing too low a buffer size
could leave the result buffer unchanged.

The behavior in the normal case of a sufficiently large buffer was
correct.

All known callers pass a sufficiently large buffer and have thus not
been affected by this issue. If a non-default value had been assigned
to this variable, the result was as documented, too.

Fix the function to fill the buffer with a partial result, if the
passed in buffer size is too low to hold the full result.

(cherry picked from commit e11ad014d1468729ecf758ab3709618a78feae1b)

libc: add helper furnction to set sysctl() user.* variables

Testing had revealed that trying to retrieve the user.localbase
variable into to small a buffer would return the correct error code,
but would not fill the available buffer space with a partial result.

A partial result is of no use, but this is still a violation of the
documented behavior, which has been fixed in the previous commit to
this function.

I just checked the code for "user.cs_path" and found that it had the
same issue.

Instead of fixing the logic for each user.* sysctl string variable
individually, this commit adds a helper function set_user_str() that
implements the semantics specified in the sysctl() man page.

It is currently only used for "user.cs_path" and "user.localbase",
but it will offer a significant simplification when further such
variables will be added (as I intend to do).

(cherry picked from commit 9535d9f104d82487abfc3a64de18f9d010bba6d2)

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.

(cherry picked from commit af7d105379a649b7af4bffd15fbeab692bb52b69)
lib/libc/gen/sysctl.c
lib/libc/gen/sysctlbyname.c