Skip to content
  • Michael Kerrisk's avatar
    [patch for 2.6.26 3/4] vfs: utimensat(): fix error checking for {UTIME_NOW,UTIME_OMIT} case · 4cca9226
    Michael Kerrisk authored
    
    
    The POSIX.1 draft spec for utimensat() says:
    
        Only a process with the effective user ID equal to the
        user ID of the file or with appropriate privileges may use
        futimens() or utimensat() with a non-null times argument
        that does not have both tv_nsec fields set to UTIME_NOW
        and does not have both tv_nsec fields set to UTIME_OMIT.
    
    If this condition is violated, then the error EPERM should result.
    However, the current implementation does not generate EPERM if
    one tv_nsec field is UTIME_NOW while the other is UTIME_OMIT.
    It should give this error for that case.
    
    This patch:
    
    a) Repairs that problem.
    b) Removes the now unneeded nsec_special() helper function.
    c) Adds some comments to explain the checks that are being
       performed.
    
    Thanks to Miklos, who provided comments on the previous iteration
    of this patch.  As a result, this version is a little simpler and
    and its logic is better structured.
    
    Miklos suggested an alternative idea, migrating the
    is_owner_or_cap() checks into fs/attr.c:inode_change_ok() via
    the use of an ATTR_OWNER_CHECK flag.  Maybe we could do that
    later, but for now I've gone with this version, which is
    IMO simpler, and can be more easily read as being correct.
    
    Acked-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Ulrich Drepper <drepper@redhat.com>
    Signed-off-by: default avatarMichael Kerrisk <mtk.manpages@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    4cca9226