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:
Rich Felker 2015-02-05 23:34:27 -05:00
parent 2736eb6caa
commit 61b1d10212

View File

@ -29,8 +29,10 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
__procfdname(proc, fd2);
ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
if (!ret && !S_ISLNK(st.st_mode))
ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
if (!ret) {
if (S_ISLNK(st.st_mode)) ret = -EOPNOTSUPP;
else ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
}
__syscall(SYS_close, fd2);
return __syscall_ret(ret);