Thread (3 messages) flat view 3 messages, 2 authors, 2016-09-26

Naming O_TMPFILE files

From: Florian Weimer <hidden>
Date: 2016-09-21 11:50:43
Also in: linux-fsdevel, linux-man

AT_EMPTY_PATH is supposed to be able to give names to files created with 
O_TMPFILE unless O_EXCL was specified at creation time.

However, since this commit

commit 11a7b371b64ef39fc5fb1b6f2218eef7c4d035e3
Author: Aneesh Kumar K.V [off-list ref]
Date:   Sat Jan 29 18:43:42 2011 +0530

fs: allow AT_EMPTY_PATH in linkat(), limit that to CAP_DAC_READ_SEARCH

linkat bails out early with AT_EMPTY_PATH and !CAP_DAC_READ_SEARCH, 
never looking at O_EXCL.

The /proc/self/fd kludge works for unprivileged users, but only if 
*both* paths use AT_FDCWD.  It fails if the first path uses a real 
descriptor for /proc/self/fd, or if the second path uses a real 
descriptor for the current directory, or both.  For privileged users, 
only AT_EMPTY_PATH case with an AT_FDCWD target works.

The attached test program prints under a non-privileged user:

error: linkat (fd, "", AT_FDCWD, out_name, AT_EMPTY_PATH):
   No such file or directory
error: linkat (fd, "", current_fd, out_name, AT_EMPTY_PATH):
   No such file or directory
success: linkat (AT_FDCWD, proc_name, AT_FDCWD, out_name, AT_SYMLINK_FOLLOW)
error: linkat (AT_FDCWD, proc_name, current_fd, out_name, 
AT_SYMLINK_FOLLOW):
   No such file or directory
error: linkat (proc_fd, proc_name, AT_FDCWD, out_name, AT_SYMLINK_FOLLOW):
   No such file or directory
error: linkat (proc_fd, proc_name, current_fd, out_name, AT_SYMLINK_FOLLOW):
   No such file or directory
successes: 1, failures: 5

And under a privileged user:

success: linkat (fd, "", AT_FDCWD, out_name, AT_EMPTY_PATH)
error: linkat (fd, "", current_fd, out_name, AT_EMPTY_PATH):
   No such file or directory
error: linkat (AT_FDCWD, proc_name, AT_FDCWD, out_name, AT_SYMLINK_FOLLOW):
   No such file or directory
error: linkat (AT_FDCWD, proc_name, current_fd, out_name, 
AT_SYMLINK_FOLLOW):
   No such file or directory
error: linkat (proc_fd, proc_name, AT_FDCWD, out_name, AT_SYMLINK_FOLLOW):
   No such file or directory
error: linkat (proc_fd, proc_name, current_fd, out_name, AT_SYMLINK_FOLLOW):
   No such file or directory
successes: 1, failures: 5

(Seen on tmpfs and XFS, 4.7.x kernels.)

I double-checked with strace, and the test case does not appear to be 
broken.  But the exhibited behavior is truly bizarre, and it means that 
it is very difficult to give a name to an O_TMPFILE file.

Is this really the intended behavior?  Has it always been this way?

Thanks,
Florian

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help