nfs: Convert nfs2xdr to use kuids and kgids
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 for incoming uid 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>
This commit is contained in:
parent
9f309c86cf
commit
cfa0898d4f
1 changed files with 15 additions and 4 deletions
|
@ -290,8 +290,13 @@ static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
|
|||
|
||||
fattr->mode = be32_to_cpup(p++);
|
||||
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;
|
||||
|
||||
fattr->size = be32_to_cpup(p++);
|
||||
fattr->du.nfs2.blocksize = be32_to_cpup(p++);
|
||||
|
||||
|
@ -313,6 +318,12 @@ static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
|
|||
fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
|
||||
|
||||
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;
|
||||
|
@ -351,11 +362,11 @@ static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr)
|
|||
else
|
||||
*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
|
||||
if (attr->ia_valid & ATTR_UID)
|
||||
*p++ = cpu_to_be32(attr->ia_uid);
|
||||
*p++ = cpu_to_be32(from_kuid(&init_user_ns, attr->ia_uid));
|
||||
else
|
||||
*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
|
||||
if (attr->ia_valid & ATTR_GID)
|
||||
*p++ = cpu_to_be32(attr->ia_gid);
|
||||
*p++ = cpu_to_be32(from_kgid(&init_user_ns, attr->ia_gid));
|
||||
else
|
||||
*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
|
||||
if (attr->ia_valid & ATTR_SIZE)
|
||||
|
|
Loading…
Reference in a new issue