From 9ca1f62b0c0d3e50480eb654ac941ff943ce0558 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 2 Aug 2013 13:33:31 -0400 Subject: 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. --- src/unistd/fchdir.c | 10 +++++++++- src/unistd/fchown.c | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src/unistd') diff --git a/src/unistd/fchdir.c b/src/unistd/fchdir.c index e5595f77..9fbc8154 100644 --- a/src/unistd/fchdir.c +++ b/src/unistd/fchdir.c @@ -1,7 +1,15 @@ #include +#include #include "syscall.h" +void __procfdname(char *, unsigned); + int fchdir(int fd) { - return syscall(SYS_fchdir, fd); + int ret = __syscall(SYS_fchdir, fd); + if (ret != -EBADF || fd < 0) return __syscall_ret(ret); + + char buf[15+3*sizeof(int)]; + __procfdname(buf, fd); + return syscall(SYS_chdir, buf); } diff --git a/src/unistd/fchown.c b/src/unistd/fchown.c index b05f0be4..e1c3198a 100644 --- a/src/unistd/fchown.c +++ b/src/unistd/fchown.c @@ -1,7 +1,15 @@ #include +#include #include "syscall.h" +void __procfdname(char *, unsigned); + int fchown(int fd, uid_t uid, gid_t gid) { - return syscall(SYS_fchown, fd, uid, gid); + int ret = __syscall(SYS_fchown, fd, uid, gid); + if (ret != -EBADF || fd < 0) return __syscall_ret(ret); + + char buf[15+3*sizeof(int)]; + __procfdname(buf, fd); + return syscall(SYS_chown, buf, uid, gid); } -- cgit v1.2.1