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 | |
| parent | 6278b62aa8f90c668a4e4b94ad9d3952cf4331b7 (diff) | |
svcrpc: fix gss-proxy to respect user namespaces
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
| -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, |
