aboutsummaryrefslogtreecommitdiff
path: root/lib/libutil/getlocalbase.c
Commit message (Collapse)AuthorAgeFilesLines
* Change getlocalbase() to not allocate any heap memoryStefan Eßer2020-12-121-20/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After the commit of the current version, Scott Long pointed out, that an attacker might be able to cause a use-after-free access if this function returned the value of the sysctl variable "user.localbase" by freeing the allocated memory without the cached address being cleared in the library function. To resolve this issue, I have proposed the originally suggested version with a statically allocated buffer in a review (D27370). There was no feedback on this review and after waiting for more than 2 weeks, the potential security issue is fixed by this commit. (There was no security risk in practice, since none of the programs converted to use this function attempted to free the buffer. The address could only have pointed into the heap if user.localbase was set to a non-default value, into r/o data or the environment, else.) This version uses a static buffer of size LOCALBASE_CTL_LEN, which defaults to MAXPATHLEN. This does not increase the memory footprint of the library at this time, since its data segment grows from less than 7 KB to less than 8 KB, i.e. it will get two 4 KB pages on typical architectures, anyway. Compiling with LOCALBASE_CTL_LEN defined as 0 will remove the code that accesses the sysctl variable, values between 1 and MAXPATHLEN-1 will limit the maximum size of the prefix. When built with such a value and if too large a value has been configured in user.localbase, the value defined as ILLEGAL_PREFIX will be returned to cause any file operations on that result to fail. (Default value is "/dev/null/", the review contained "/\177", but I assume that "/dev/null" exists and can not be accessed as a directory. Any other string that can be assumed not be a valid path prefix could be used.) I do suggest to use LOCALBASE_CTL_LEN to size the in-kernel buffer for the user.localbase variable, too. Doing this would guarantee that the result always fit into the buffer in this library function (unless run on a kernel built with a different buffer size.) The function always returns a valid string, and only in case it is built with a small static buffer and run on a system with too large a value in user.localbase, the ILLEGAL_PREFIX will be returned, effectively causing the created path to be non-existent. Differential Revision: https://reviews.freebsd.org/D27370 Notes: svn path=/head/; revision=368577
* Add function getlocalbase() to libutil.Stefan Eßer2020-11-181-0/+74
| | | | | | | | | | | | | | | | | | This function returns the path to the local software base directory, by default "/usr/local" (or the value of _PATH_LOCALBASE in include/paths.h when building the world). The value returned can be overridden by 2 methods: - the LOCALBASE environment variable (ignored by SUID programs) - else a non-default user.localbase sysctl value Reviewed by: hps (earlier version) Relnotes: yes Differential Revision: https://reviews.freebsd.org/D27236 Notes: svn path=/head/; revision=367813
* Revert the whole getlocalbase() set of changes while a different design isScott Long2020-11-151-89/+0
| | | | | | | hashed out. Notes: svn path=/head/; revision=367711
* Because getlocalbase() returns -1 on error, it needs to use a signed typeScott Long2020-11-151-5/+12
| | | | | | | | internally. Do that, and make sure that conversations between signed and unsigned don't overflow Notes: svn path=/head/; revision=367701
* Fix a problem with r367686 related to the use of ssize_t. Not sure how thisScott Long2020-11-141-3/+10
| | | | | | | | | escaped prior testing, but it should be better now. Reported by: lots Notes: svn path=/head/; revision=367689
* Add the library function getlocalbase and its manual page. This helps toScott Long2020-11-141-0/+75
unify the retrieval of the various ways that the local software base directory, typically "/usr/local", is expressed in the system. Reviewed by: se Differential Revision: https://reviews.freebsd.org/D27022 Notes: svn path=/head/; revision=367686