Re: [BUG] Generic syscalls -- chmod vs. fchmodat
From: Linas Vepstas <linasvepstas@gmail.com>
Date: 2011-01-25 22:11:13
Also in:
lkml
Hi, On 25 January 2011 15:32, Eric Blake [off-list ref] wrote:
7. fchmodat(AT_FDCWD, "") must fail with ENOENT. Apparently, the kernel currently modifies ".", although point 1 says it might make more sense to fail with ENOENT so that glibc doesn't have to do as much work in chmod and fchmodat (if the kernel call does not change, then the burden is on glibc).
Interesting discussion, but I'm very embarrassed to say I started it
due to a mis-diagnosis of a bug :-(
In fact, the current kernels *do* check for an empty string, and do so
in order to maintain POSIX compliance, per Eric's points 5 and 7.
See fs/namei.c in do_getname, circa line 114, where we read:
* POSIX.1 2.4: an empty pathname is invalid (ENOENT).
This is backed up with code, circa line 129 ff:
retval = strncpy_from_user(page, filename, len);
...
else if (!retval)
retval = -ENOENT;
return retval;
So an empty string will have length zero, and the ENOENT is indeed
set.
This handles cases 5 & 7. I've no idea how any of the other cases
work out.
Note that getname() is used in a variety of places; its not just chmod,
but also in symlinks and many others.
--linas