فهرست منبع

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 سال پیش
والد
کامیت
61b1d10212
1فایلهای تغییر یافته به همراه4 افزوده شده و 2 حذف شده
  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);