aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/auth_gss/gss_rpc_xdr.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/net/sunrpc/auth_gss/gss_rpc_xdr.c b/net/sunrpc/auth_gss/gss_rpc_xdr.c
index d0ccdffa7e54..5c4c61d527e2 100644
--- a/net/sunrpc/auth_gss/gss_rpc_xdr.c
+++ b/net/sunrpc/auth_gss/gss_rpc_xdr.c
@@ -216,13 +216,13 @@ static int gssx_dec_linux_creds(struct xdr_stream *xdr,
216 err = get_s32(&q, end, &tmp); 216 err = get_s32(&q, end, &tmp);
217 if (err) 217 if (err)
218 return err; 218 return err;
219 creds->cr_uid = tmp; 219 creds->cr_uid = make_kuid(&init_user_ns, tmp);
220 220
221 /* gid */ 221 /* gid */
222 err = get_s32(&q, end, &tmp); 222 err = get_s32(&q, end, &tmp);
223 if (err) 223 if (err)
224 return err; 224 return err;
225 creds->cr_gid = tmp; 225 creds->cr_gid = make_kgid(&init_user_ns, tmp);
226 226
227 /* number of additional gid's */ 227 /* number of additional gid's */
228 err = get_s32(&q, end, &tmp); 228 err = get_s32(&q, end, &tmp);
@@ -235,15 +235,21 @@ static int gssx_dec_linux_creds(struct xdr_stream *xdr,
235 235
236 /* gid's */ 236 /* gid's */
237 for (i = 0; i < N; i++) { 237 for (i = 0; i < N; i++) {
238 kgid_t kgid;
238 err = get_s32(&q, end, &tmp); 239 err = get_s32(&q, end, &tmp);
239 if (err) { 240 if (err)
240 groups_free(creds->cr_group_info); 241 goto out_free_groups;
241 return err; 242 err = -EINVAL;
242 } 243 kgid = make_kgid(&init_user_ns, tmp);
243 GROUP_AT(creds->cr_group_info, i) = tmp; 244 if (!gid_valid(kgid))
245 goto out_free_groups;
246 GROUP_AT(creds->cr_group_info, i) = kgid;
244 } 247 }
245 248
246 return 0; 249 return 0;
250out_free_groups:
251 groups_free(creds->cr_group_info);
252 return err;
247} 253}
248 254
249static int gssx_dec_option_array(struct xdr_stream *xdr, 255static int gssx_dec_option_array(struct xdr_stream *xdr,