statx: Kill fd-with-NULL-path support in favour of AT_EMPTY_PATH

With the new statx() syscall, the following both allow the attributes of
the file attached to a file descriptor to be retrieved:

statx(dfd, NULL, 0, ...);

and:

statx(dfd, "", AT_EMPTY_PATH, ...);

Change the code to reject the first option, though this means copying
the path and engaging pathwalk for the fstat() equivalent. dfd can be a
non-directory provided path is "".

[ The timing of this isn't wonderful, but applying this now before we
have statx() in any released kernel, before anybody starts using the
NULL special case. - Linus ]

Fixes: a528d35e8bfc ("statx: Add a system call to make enhanced file info available")
Reported-by: Michael Kerrisk <mtk.manpages@gmail.com>
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Eric Sandeen <sandeen@sandeen.net>
cc: fstests@vger.kernel.org
cc: linux-api@vger.kernel.org
cc: linux-man@vger.kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by David Howells and committed by Linus Torvalds 1e2f82d1 fc08b197

+6 -7
+6 -7
fs/stat.c
··· 547 547 /** 548 548 * sys_statx - System call to get enhanced stats 549 549 * @dfd: Base directory to pathwalk from *or* fd to stat. 550 - * @filename: File to stat *or* NULL. 550 + * @filename: File to stat or "" with AT_EMPTY_PATH 551 551 * @flags: AT_* flags to control pathwalk. 552 552 * @mask: Parts of statx struct actually required. 553 553 * @buffer: Result buffer. 554 554 * 555 - * Note that if filename is NULL, then it does the equivalent of fstat() using 556 - * dfd to indicate the file of interest. 555 + * Note that fstat() can be emulated by setting dfd to the fd of interest, 556 + * supplying "" as the filename and setting AT_EMPTY_PATH in the flags. 557 557 */ 558 558 SYSCALL_DEFINE5(statx, 559 559 int, dfd, const char __user *, filename, unsigned, flags, ··· 567 567 return -EINVAL; 568 568 if ((flags & AT_STATX_SYNC_TYPE) == AT_STATX_SYNC_TYPE) 569 569 return -EINVAL; 570 + if (!filename) 571 + return -EINVAL; 570 572 571 - if (filename) 572 - error = vfs_statx(dfd, filename, flags, &stat, mask); 573 - else 574 - error = vfs_statx_fd(dfd, &stat, mask, flags); 573 + error = vfs_statx(dfd, filename, flags, &stat, mask); 575 574 if (error) 576 575 return error; 577 576