summaryrefslogtreecommitdiff
path: root/src/unistd/faccessat.c
AgeCommit message (Collapse)AuthorLines
2013-11-01simplify faccessat AT_EACCESS path and eliminate resource dependenceRich Felker-14/+21
now that we're waiting for the exit status of the child process, the result can be conveyed in the exit status rather than via a pipe. since the error value might not fit in 7 bits, a table is used to translate possible meaningful error values to small integers.
2013-11-01fix faccessat AT_EACCESS path not to leave zombie processesRich Felker-2/+6
I mistakenly assumed that clone without a signal produced processes that would not become zombies; however, waitpid with __WCLONE is required to release their pids.
2013-10-18in faccessat slow path, add close-on-exec to pipe fdsRich Felker-1/+1
as usual, this is needed to avoid fd leaks. as a better solution, the use of fds could possibly be replaced with mmap and a futex.
2013-10-12fix uid/gid-setting error in faccessat with AT_EACCESS flagRich Felker-2/+2
this fixes an issue reported by Daniel Thau whereby faccessat with the AT_EACCESS flag did not work in cases where the process is running suid or sgid but without root privileges. per POSIX, when the process does not have "appropriate privileges", setuid changes the euid, not the real uid, and the target uid must be equal to the current real or saved uid; if this condition is not met, EPERM results. this caused the faccessat child process to fail. using the setreuid syscall rather than setuid works. POSIX leaves it unspecified whether setreuid can set the real user id to the effective user id on processes without "appropriate privileges", but Linux allows this; if it's not allowed, there would be no way for this function to work.
2013-08-31fix missing return value warning in faccessat, minor cleanupRich Felker-1/+1
clone will pass the return value of the start function to SYS_exit anyway; there's no need to call the syscall directly.
2013-08-09block all signals, even implementation-internal ones, in faccessat childRich Felker-1/+1
the child process's stack may be insufficient size to support a signal frame, and there is no reason these signal handlers should run in the child anyway.
2013-08-03fix faccessat to support AT_EACCESS flagRich Felker-1/+46
this is another case of the kernel syscall failing to support flags where it needs to, leading to horrible workarounds in userspace. this time the workaround requires changing uid/gid, and that's not safe to do in the current process. in the worst case, kernel resource limits might prevent recovering the original values, and then there would be no way to safely return. so, use the safe but horribly inefficient alternative: forking. clone is used instead of fork to suppress signals from the child. fortunately this worst-case code is only needed when effective and real ids mismatch, which mainly happens in suid programs.
2011-03-20global cleanup to use the new syscall interfaceRich Felker-1/+1
2011-02-12initial check-in, version 0.5.0v0.5.0Rich Felker-0/+7