• S
    nfsd: revoking of suid/sgid bits after chown() in a consistent way · c4fa6d7c
    Stanislav Kholmanskikh 提交于
    There is an inconsistency in the handling of SUID/SGID file
    bits after chown() between NFS and other local file systems.
    
    Local file systems (for example, ext3, ext4, xfs, btrfs) revoke
    SUID/SGID bits after chown() on a regular file even if
    the owner/group of the file has not been changed:
    
    ~# touch file; chmod ug+s file; chmod u+x file
    ~# ls -l file
    -rwsr-Sr-- 1 root root 0 Dec  6 04:49 file
    ~# chown root file; ls -l file
    -rwxr-Sr-- 1 root root 0 Dec  6 04:49 file
    
    but NFS doesn't do that:
    
    ~# touch file; chmod ug+s file; chmod u+x file
    ~# ls -l file
    -rwsr-Sr-- 1 root root 0 Dec  6 04:49 file
    ~# chown root file; ls -l file
    -rwsr-Sr-- 1 root root 0 Dec  6 04:49 file
    
    NFS does that only if the owner/group has been changed:
    
    ~# touch file; chmod ug+s file; chmod u+x file
    ~# ls -l file
    -rwsr-Sr-- 1 root root 0 Dec  6 05:02 file
    ~# chown bin file; ls -l file
    -rwxr-Sr-- 1 bin root 0 Dec  6 05:02 file
    
    See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html
    
     "If the specified file is a regular file, one or more of
     the S_IXUSR, S_IXGRP, or S_IXOTH bits of the file mode are set,
     and the process has appropriate privileges, it is
     implementation-defined whether the set-user-ID and set-group-ID
     bits are altered."
    
    So both variants are acceptable by POSIX.
    
    This patch makes NFS to behave like local file systems.
    Signed-off-by: NStanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
    Signed-off-by: NJ. Bruce Fields <bfields@redhat.com>
    c4fa6d7c
vfs.c 55.5 KB