mirror of https://git.musl-libc.org/git/musl
Browse Source
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.rs-1.0
4 changed files with 37 additions and 5 deletions
@ -1,7 +1,15 @@ |
|||||
#include <sys/stat.h> |
#include <sys/stat.h> |
||||
|
#include <errno.h> |
||||
#include "syscall.h" |
#include "syscall.h" |
||||
|
|
||||
|
void __procfdname(char *, unsigned); |
||||
|
|
||||
int fchmod(int fd, mode_t mode) |
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); |
||||
} |
} |
||||
|
|||||
@ -1,10 +1,18 @@ |
|||||
#include <sys/stat.h> |
#include <sys/stat.h> |
||||
|
#include <errno.h> |
||||
#include "syscall.h" |
#include "syscall.h" |
||||
#include "libc.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); |
LFS64(fstat); |
||||
|
|||||
@ -1,7 +1,15 @@ |
|||||
#include <unistd.h> |
#include <unistd.h> |
||||
|
#include <errno.h> |
||||
#include "syscall.h" |
#include "syscall.h" |
||||
|
|
||||
|
void __procfdname(char *, unsigned); |
||||
|
|
||||
int fchdir(int fd) |
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); |
||||
} |
} |
||||
|
|||||
@ -1,7 +1,15 @@ |
|||||
#include <unistd.h> |
#include <unistd.h> |
||||
|
#include <errno.h> |
||||
#include "syscall.h" |
#include "syscall.h" |
||||
|
|
||||
|
void __procfdname(char *, unsigned); |
||||
|
|
||||
int fchown(int fd, uid_t uid, gid_t gid) |
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); |
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue