lkml.org 
[lkml]   [2013]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH review 58/85] nfs: Convert nfs3xdr to use kuids and kgids
    From: "Eric W. Biederman" <ebiederm@xmission.com>

    When reading uids and gids off the wire convert them to
    kuids and kgids.

    When putting kuids and kgids onto the wire first convert
    them to uids and gids the other side will understand.

    Add an additional failure mode incoming for uids or gids
    that are invalid.

    Cc: "J. Bruce Fields" <bfields@fieldses.org>
    Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    ---
    fs/nfs/nfs3xdr.c | 18 ++++++++++++++----
    1 files changed, 14 insertions(+), 4 deletions(-)

    diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
    index bffc324..fa6d721 100644
    --- a/fs/nfs/nfs3xdr.c
    +++ b/fs/nfs/nfs3xdr.c
    @@ -592,13 +592,13 @@ static void encode_sattr3(struct xdr_stream *xdr, const struct iattr *attr)

    if (attr->ia_valid & ATTR_UID) {
    *p++ = xdr_one;
    - *p++ = cpu_to_be32(attr->ia_uid);
    + *p++ = cpu_to_be32(from_kuid(&init_user_ns, attr->ia_uid));
    } else
    *p++ = xdr_zero;

    if (attr->ia_valid & ATTR_GID) {
    *p++ = xdr_one;
    - *p++ = cpu_to_be32(attr->ia_gid);
    + *p++ = cpu_to_be32(from_kgid(&init_user_ns, attr->ia_gid));
    } else
    *p++ = xdr_zero;

    @@ -657,8 +657,12 @@ static int decode_fattr3(struct xdr_stream *xdr, struct nfs_fattr *fattr)

    fattr->mode = (be32_to_cpup(p++) & ~S_IFMT) | fmode;
    fattr->nlink = be32_to_cpup(p++);
    - fattr->uid = be32_to_cpup(p++);
    - fattr->gid = be32_to_cpup(p++);
    + fattr->uid = make_kuid(&init_user_ns, be32_to_cpup(p++));
    + if (!uid_valid(fattr->uid))
    + goto out_uid;
    + fattr->gid = make_kgid(&init_user_ns, be32_to_cpup(p++));
    + if (!gid_valid(fattr->gid))
    + goto out_gid;

    p = xdr_decode_size3(p, &fattr->size);
    p = xdr_decode_size3(p, &fattr->du.nfs3.used);
    @@ -675,6 +679,12 @@ static int decode_fattr3(struct xdr_stream *xdr, struct nfs_fattr *fattr)

    fattr->valid |= NFS_ATTR_FATTR_V3;
    return 0;
    +out_uid:
    + dprintk("NFS: returned invalid uid\n");
    + return -EINVAL;
    +out_gid:
    + dprintk("NFS: returned invalid gid\n");
    + return -EINVAL;
    out_overflow:
    print_overflow_msg(__func__, xdr);
    return -EIO;
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2013-02-13 19:41    [W:4.023 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site