提交 9ca1f62b 编写于 作者: R Rich Felker

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.
上级 c8c0844f
#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);
}
#include <sys/stat.h>
#include <errno.h>
#include "syscall.h"
#include "libc.h"
int fstat(int fd, struct stat *buf)
void __procfdname(char *, unsigned);
int fstat(int fd, struct stat *st)
{
return syscall(SYS_fstat, fd, buf);
int ret = __syscall(SYS_fstat, fd, st);
if (ret != -EBADF || fd < 0) return __syscall_ret(ret);
char buf[15+3*sizeof(int)];
__procfdname(buf, fd);
return syscall(SYS_stat, buf, st);
}
LFS64(fstat);
#include <unistd.h>
#include <errno.h>
#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);
}
#include <unistd.h>
#include <errno.h>
#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);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册