make fchdir, fchmod, fchown, and fstat support O_PATH file descriptors

on newer kernels, fchdir and fstat work anyway. this same fix should
be applied to any other syscalls that are similarly affected.

with this change, the current definitions of O_SEARCH and O_EXEC as
O_PATH are mostly conforming to POSIX requirements. the main remaining
issue is that O_NOFOLLOW has different semantics.
This commit is contained in:
Rich Felker
2013-08-02 13:33:31 -04:00
parent c8c0844f7f
commit 9ca1f62b0c
4 changed files with 37 additions and 5 deletions
+9 -1
View File
@@ -1,7 +1,15 @@
#include <sys/stat.h>
#include <errno.h>
#include "syscall.h"
void __procfdname(char *, unsigned);
int fchmod(int fd, mode_t mode)
{
return syscall(SYS_fchmod, fd, mode);
int ret = __syscall(SYS_fchmod, fd, mode);
if (ret != -EBADF || fd < 0) return __syscall_ret(ret);
char buf[15+3*sizeof(int)];
__procfdname(buf, fd);
return syscall(SYS_chmod, buf, mode);
}