summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGaƫl PORTAY <gael.portay@rtone.fr>2024-02-18 03:26:50 +0100
committerRich Felker <dalias@aerifal.cx>2024-02-22 19:27:23 -0500
commitd0ed307e6f79476bda12e531f7d30378a6167b65 (patch)
treed6f9e2bf34a5fbb68d35d67cee3de2b9b75406ea /src
parent3d5c9fe39ff6ceb0730d44122fd2c4cd58b4e358 (diff)
downloadmusl-d0ed307e6f79476bda12e531f7d30378a6167b65.tar.gz
use new SYS_fchmodat2 syscall to implement fchmodat with flags
commit 0dc4824479e357a3e23a02d35527e23fca920343 worked around for lack of flags argument in syscall for fchmodat. linux 6.6 introduced a new syscall, SYS_fchmodat2, fixing this deficiency. use it if any flags are passed, and fallback to the old strategy on ENOSYS. continue using the old syscall when there are no flags. this is the exact same strategy used when SYS_faccessat2 was used to implement faccessat with flags.
Diffstat (limited to 'src')
-rw-r--r--src/stat/fchmodat.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/stat/fchmodat.c b/src/stat/fchmodat.c
index 41db0c46..92c9d1b0 100644
--- a/src/stat/fchmodat.c
+++ b/src/stat/fchmodat.c
@@ -7,11 +7,14 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
{
if (!flag) return syscall(SYS_fchmodat, fd, path, mode);
+ int ret = __syscall(SYS_fchmodat2, fd, path, mode, flag);
+ if (ret != -ENOSYS) return __syscall_ret(ret);
+
if (flag != AT_SYMLINK_NOFOLLOW)
return __syscall_ret(-EINVAL);
struct stat st;
- int ret, fd2;
+ int fd2;
char proc[15+3*sizeof(int)];
if (fstatat(fd, path, &st, flag))