mirror of git://git.musl-libc.org/musl
fix failure of fchmodat to report EOPNOTSUPP in the race path
in the case where a non-symlink file was replaced by a symlink during the fchmodat operation with AT_SYMLINK_NOFOLLOW, mode change on the new symlink target was successfully suppressed, but the error was not reported. instead, fchmodat simply returned 0.
This commit is contained in:
parent
2736eb6caa
commit
61b1d10212
|
@ -29,8 +29,10 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
|
||||||
|
|
||||||
__procfdname(proc, fd2);
|
__procfdname(proc, fd2);
|
||||||
ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
|
ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
|
||||||
if (!ret && !S_ISLNK(st.st_mode))
|
if (!ret) {
|
||||||
ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
|
if (S_ISLNK(st.st_mode)) ret = -EOPNOTSUPP;
|
||||||
|
else ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
|
||||||
|
}
|
||||||
|
|
||||||
__syscall(SYS_close, fd2);
|
__syscall(SYS_close, fd2);
|
||||||
return __syscall_ret(ret);
|
return __syscall_ret(ret);
|
||||||
|
|
Loading…
Reference in New Issue