On 12/30/2019 2:18 PM, Brian Inglis wrote: > On 2019-12-29 10:56, Ken Brown wrote: >> Currently, opening a symlink with O_NOFOLLOW fails with ELOOP. >> Following Linux, the first patch in this series allows the call to >> succeed if O_PATH is also specified. >> >> According to the Linux man page for 'open', the file descriptor >> returned by the call should be usable as the dirfd argument in calls >> to fstatat and readlinkat with an empty pathname, to have >> the calls operate on the symbolic link. The second and third patches >> achieve this. For fstatat, we do this by adding support >> for the AT_EMPTY_PATH flag. >> >> Note: The man page mentions fchownat and linkat also. linkat already >> supports the AT_EMPTY_PATH flag, so nothing needs to be done. But I >> don't understand how this could work for fchownat, because fchown >> fails with EBADF if its fd argument was opened with O_PATH. So I >> haven't touched fchownat. >> >> Am I missing something? > > WSL $ man 2 chown > ... > "AT_EMPTY_PATH (since Linux 2.6.39) > If pathname is an empty string, operate on the file referred to > by dirfd (which may have been obtained using the open(2) O_PATH > flag). In this case, dirfd can refer to any type of file, not > just a directory. If dirfd is AT_FDCWD, the call operates on > the current working directory. This flag is Linux-specific; de‐ > fine _GNU_SOURCE to obtain its definition." > > says chown the dirfd, regardless of what it is, > except if AT_FDCWD, chown the CWD. > > WSL $ man 2 open > "O_PATH (since Linux 2.6.39) > Obtain a file descriptor that can be used for two purposes: to > indicate a location in the filesystem tree and to perform > operations that act purely at the file descriptor level. The > file itself is not opened, and other file operations (e.g., > read(2), write(2), fchmod(2), fchown(2), fgetxattr(2), > ioctl(2), mmap(2)) fail with the error EBADF." > > O_PATH does not open the file, so fchown returns EBADF, > as it requires an fd of an open file.
I think you've just confirmed what I already said: If fchownat is called with AT_EMPTY_PATH, with an empty pathname, and with dirfd referring to a file that was opened with O_PATH, then fchownat will fail with EBADF. So for the purposes of this patch series, I don't see the point of adding support for AT_EMPTY_PATH in fchownat. Am I missing something? Ken