Browse Source

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.
Rich Felker 10 years ago
parent
commit
61b1d10212
1 changed files with 4 additions and 2 deletions
  1. 4 2
      src/stat/fchmodat.c

+ 4 - 2
src/stat/fchmodat.c

@@ -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);