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 năm trước cách đây
mục cha
commit
61b1d10212
1 tập tin đã thay đổi với 4 bổ sung2 xóa
  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);
 	__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))
-		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);
 	__syscall(SYS_close, fd2);
 	return __syscall_ret(ret);
 	return __syscall_ret(ret);