[BUG] Generic syscalls -- chmod vs. fchmodat
Linas Vepstas
linasvepstas@gmail.com
Wed Jan 26 04:05:00 GMT 2011
Hi,
On 25 January 2011 15:32, Eric Blake <eblake@redhat.com> 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
More information about the Libc-alpha
mailing list