Re: [BUG] Generic syscalls -- chmod vs. fchmodat

From: Linas Vepstas
Date: Tue Jan 25 2011 - 17:11:17 EST


Hi,

On 25 January 2011 15:32, Eric Blake <eblake@xxxxxxxxxx> 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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/