Paul Eggert wrote: > If you compile and run the attached > program on a file that you don't own (e.g., './a.out /'), does it > incorrectly issue "Permission denied" instead of "Operation not > permitted" diagnostics?
In this case, the diagnostic is "Operation not permitted" (from EPERM): $ ./a.out / lchown: Operation not permitted fchownat: Operation not permitted chown: Operation not permitted fchown: Operation not permitted $ strace ./a.out / ... lchown("/", 0, 0) = -1 EPERM (Operation not permitted) dup(2) = 3 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) getrandom("\x30\x26\x33\x40\x27\x47\x25\x78", 8, GRND_NONBLOCK) = 8 brk(NULL) = 0x55f0af430000 brk(0x55f0af451000) = 0x55f0af451000 newfstatat(3, "", {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0x9), ...}, AT_EMPTY_PATH) = 0 write(3, "lchown: Operation not permitted\n", 32lchown: Operation not permitted ) = 32 close(3) = 0 fchownat(AT_FDCWD, "/", 0, 0, AT_SYMLINK_NOFOLLOW) = -1 EPERM (Operation not permitted) dup(2) = 3 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) newfstatat(3, "", {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0x9), ...}, AT_EMPTY_PATH) = 0 write(3, "fchownat: Operation not permitte"..., 34fchownat: Operation not permitted ) = 34 close(3) = 0 chown("/", 0, 0) = -1 EPERM (Operation not permitted) dup(2) = 3 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) newfstatat(3, "", {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0x9), ...}, AT_EMPTY_PATH) = 0 write(3, "chown: Operation not permitted\n", 31chown: Operation not permitted ) = 31 close(3) = 0 openat(AT_FDCWD, "/", O_RDONLY|O_NOFOLLOW) = 3 fchown(3, 0, 0) = -1 EPERM (Operation not permitted) dup(2) = 4 fcntl(4, F_GETFL) = 0x2 (flags O_RDWR) newfstatat(4, "", {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0x9), ...}, AT_EMPTY_PATH) = 0 write(4, "fchown: Operation not permitted\n", 32fchown: Operation not permitted ) = 32 close(4) = 0 exit_group(1) = ? +++ exited with 1 +++ Bruno