diff options
author | J. Bruce Fields <bfields@redhat.com> | 2013-04-29 18:21:29 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2013-04-29 18:21:29 -0400 |
commit | d28fcc830c2eadc526e43b0a5f6d2ed04e7421ef (patch) | |
tree | af8c781e8060011a688edb0e42f3c687389d32e1 /net/sunrpc | |
parent | 6278b62aa8f90c668a4e4b94ad9d3952cf4331b7 (diff) |
svcrpc: fix gss-proxy to respect user namespaces
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/auth_gss/gss_rpc_xdr.c | 20 |
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; |
250 | out_free_groups: | ||
251 | groups_free(creds->cr_group_info); | ||
252 | return err; | ||
247 | } | 253 | } |
248 | 254 | ||
249 | static int gssx_dec_option_array(struct xdr_stream *xdr, | 255 | static int gssx_dec_option_array(struct xdr_stream *xdr, |