diff options
Diffstat (limited to 'net/sunrpc/svcauth_unix.c')
-rw-r--r-- | net/sunrpc/svcauth_unix.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index faf17195a9fd..bdea0a1b6d1d 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c | |||
@@ -470,7 +470,7 @@ static void unix_gid_request(struct cache_detail *cd, | |||
470 | char tuid[20]; | 470 | char tuid[20]; |
471 | struct unix_gid *ug = container_of(h, struct unix_gid, h); | 471 | struct unix_gid *ug = container_of(h, struct unix_gid, h); |
472 | 472 | ||
473 | snprintf(tuid, 20, "%u", ug->uid); | 473 | snprintf(tuid, 20, "%u", from_kuid(&init_user_ns, ug->uid)); |
474 | qword_add(bpp, blen, tuid); | 474 | qword_add(bpp, blen, tuid); |
475 | (*bpp)[-1] = '\n'; | 475 | (*bpp)[-1] = '\n'; |
476 | } | 476 | } |
@@ -486,7 +486,8 @@ static int unix_gid_parse(struct cache_detail *cd, | |||
486 | char *mesg, int mlen) | 486 | char *mesg, int mlen) |
487 | { | 487 | { |
488 | /* uid expiry Ngid gid0 gid1 ... gidN-1 */ | 488 | /* uid expiry Ngid gid0 gid1 ... gidN-1 */ |
489 | int uid; | 489 | int id; |
490 | kuid_t uid; | ||
490 | int gids; | 491 | int gids; |
491 | int rv; | 492 | int rv; |
492 | int i; | 493 | int i; |
@@ -498,9 +499,12 @@ static int unix_gid_parse(struct cache_detail *cd, | |||
498 | return -EINVAL; | 499 | return -EINVAL; |
499 | mesg[mlen-1] = 0; | 500 | mesg[mlen-1] = 0; |
500 | 501 | ||
501 | rv = get_int(&mesg, &uid); | 502 | rv = get_int(&mesg, &id); |
502 | if (rv) | 503 | if (rv) |
503 | return -EINVAL; | 504 | return -EINVAL; |
505 | uid = make_kuid(&init_user_ns, id); | ||
506 | if (!uid_valid(uid)) | ||
507 | return -EINVAL; | ||
504 | ug.uid = uid; | 508 | ug.uid = uid; |
505 | 509 | ||
506 | expiry = get_expiry(&mesg); | 510 | expiry = get_expiry(&mesg); |
@@ -554,7 +558,7 @@ static int unix_gid_show(struct seq_file *m, | |||
554 | struct cache_detail *cd, | 558 | struct cache_detail *cd, |
555 | struct cache_head *h) | 559 | struct cache_head *h) |
556 | { | 560 | { |
557 | struct user_namespace *user_ns = current_user_ns(); | 561 | struct user_namespace *user_ns = &init_user_ns; |
558 | struct unix_gid *ug; | 562 | struct unix_gid *ug; |
559 | int i; | 563 | int i; |
560 | int glen; | 564 | int glen; |
@@ -570,7 +574,7 @@ static int unix_gid_show(struct seq_file *m, | |||
570 | else | 574 | else |
571 | glen = 0; | 575 | glen = 0; |
572 | 576 | ||
573 | seq_printf(m, "%u %d:", ug->uid, glen); | 577 | seq_printf(m, "%u %d:", from_kuid_munged(user_ns, ug->uid), glen); |
574 | for (i = 0; i < glen; i++) | 578 | for (i = 0; i < glen; i++) |
575 | seq_printf(m, " %d", from_kgid_munged(user_ns, GROUP_AT(ug->gi, i))); | 579 | seq_printf(m, " %d", from_kgid_munged(user_ns, GROUP_AT(ug->gi, i))); |
576 | seq_printf(m, "\n"); | 580 | seq_printf(m, "\n"); |