diff options
Diffstat (limited to 'fs/nfsd/nfs3xdr.c')
-rw-r--r-- | fs/nfsd/nfs3xdr.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 7af9417be88d..14d9ecb96cff 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c | |||
@@ -106,12 +106,14 @@ decode_sattr3(__be32 *p, struct iattr *iap) | |||
106 | iap->ia_mode = ntohl(*p++); | 106 | iap->ia_mode = ntohl(*p++); |
107 | } | 107 | } |
108 | if (*p++) { | 108 | if (*p++) { |
109 | iap->ia_valid |= ATTR_UID; | 109 | iap->ia_uid = make_kuid(&init_user_ns, ntohl(*p++)); |
110 | iap->ia_uid = ntohl(*p++); | 110 | if (uid_valid(iap->ia_uid)) |
111 | iap->ia_valid |= ATTR_UID; | ||
111 | } | 112 | } |
112 | if (*p++) { | 113 | if (*p++) { |
113 | iap->ia_valid |= ATTR_GID; | 114 | iap->ia_gid = make_kgid(&init_user_ns, ntohl(*p++)); |
114 | iap->ia_gid = ntohl(*p++); | 115 | if (gid_valid(iap->ia_gid)) |
116 | iap->ia_valid |= ATTR_GID; | ||
115 | } | 117 | } |
116 | if (*p++) { | 118 | if (*p++) { |
117 | u64 newsize; | 119 | u64 newsize; |
@@ -168,8 +170,8 @@ encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, | |||
168 | *p++ = htonl(nfs3_ftypes[(stat->mode & S_IFMT) >> 12]); | 170 | *p++ = htonl(nfs3_ftypes[(stat->mode & S_IFMT) >> 12]); |
169 | *p++ = htonl((u32) stat->mode); | 171 | *p++ = htonl((u32) stat->mode); |
170 | *p++ = htonl((u32) stat->nlink); | 172 | *p++ = htonl((u32) stat->nlink); |
171 | *p++ = htonl((u32) nfsd_ruid(rqstp, stat->uid)); | 173 | *p++ = htonl((u32) from_kuid(&init_user_ns, stat->uid)); |
172 | *p++ = htonl((u32) nfsd_rgid(rqstp, stat->gid)); | 174 | *p++ = htonl((u32) from_kgid(&init_user_ns, stat->gid)); |
173 | if (S_ISLNK(stat->mode) && stat->size > NFS3_MAXPATHLEN) { | 175 | if (S_ISLNK(stat->mode) && stat->size > NFS3_MAXPATHLEN) { |
174 | p = xdr_encode_hyper(p, (u64) NFS3_MAXPATHLEN); | 176 | p = xdr_encode_hyper(p, (u64) NFS3_MAXPATHLEN); |
175 | } else { | 177 | } else { |