aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/exit.c6
-rw-r--r--kernel/sys.c216
-rw-r--r--kernel/timer.c8
-rw-r--r--kernel/uid16.c34
4 files changed, 178 insertions, 86 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index d8bd3b425fa..789e3c5777f 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1214,7 +1214,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1214 unsigned long state; 1214 unsigned long state;
1215 int retval, status, traced; 1215 int retval, status, traced;
1216 pid_t pid = task_pid_vnr(p); 1216 pid_t pid = task_pid_vnr(p);
1217 uid_t uid = __task_cred(p)->uid; 1217 uid_t uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid);
1218 struct siginfo __user *infop; 1218 struct siginfo __user *infop;
1219 1219
1220 if (!likely(wo->wo_flags & WEXITED)) 1220 if (!likely(wo->wo_flags & WEXITED))
@@ -1427,7 +1427,7 @@ static int wait_task_stopped(struct wait_opts *wo,
1427 if (!unlikely(wo->wo_flags & WNOWAIT)) 1427 if (!unlikely(wo->wo_flags & WNOWAIT))
1428 *p_code = 0; 1428 *p_code = 0;
1429 1429
1430 uid = task_uid(p); 1430 uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid);
1431unlock_sig: 1431unlock_sig:
1432 spin_unlock_irq(&p->sighand->siglock); 1432 spin_unlock_irq(&p->sighand->siglock);
1433 if (!exit_code) 1433 if (!exit_code)
@@ -1500,7 +1500,7 @@ static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
1500 } 1500 }
1501 if (!unlikely(wo->wo_flags & WNOWAIT)) 1501 if (!unlikely(wo->wo_flags & WNOWAIT))
1502 p->signal->flags &= ~SIGNAL_STOP_CONTINUED; 1502 p->signal->flags &= ~SIGNAL_STOP_CONTINUED;
1503 uid = task_uid(p); 1503 uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid);
1504 spin_unlock_irq(&p->sighand->siglock); 1504 spin_unlock_irq(&p->sighand->siglock);
1505 1505
1506 pid = task_pid_vnr(p); 1506 pid = task_pid_vnr(p);
diff --git a/kernel/sys.c b/kernel/sys.c
index 39962818c00..aff09f208eb 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -555,9 +555,19 @@ void ctrl_alt_del(void)
555 */ 555 */
556SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid) 556SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
557{ 557{
558 struct user_namespace *ns = current_user_ns();
558 const struct cred *old; 559 const struct cred *old;
559 struct cred *new; 560 struct cred *new;
560 int retval; 561 int retval;
562 kgid_t krgid, kegid;
563
564 krgid = make_kgid(ns, rgid);
565 kegid = make_kgid(ns, egid);
566
567 if ((rgid != (gid_t) -1) && !gid_valid(krgid))
568 return -EINVAL;
569 if ((egid != (gid_t) -1) && !gid_valid(kegid))
570 return -EINVAL;
561 571
562 new = prepare_creds(); 572 new = prepare_creds();
563 if (!new) 573 if (!new)
@@ -566,25 +576,25 @@ SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
566 576
567 retval = -EPERM; 577 retval = -EPERM;
568 if (rgid != (gid_t) -1) { 578 if (rgid != (gid_t) -1) {
569 if (old->gid == rgid || 579 if (gid_eq(old->gid, krgid) ||
570 old->egid == rgid || 580 gid_eq(old->egid, krgid) ||
571 nsown_capable(CAP_SETGID)) 581 nsown_capable(CAP_SETGID))
572 new->gid = rgid; 582 new->gid = krgid;
573 else 583 else
574 goto error; 584 goto error;
575 } 585 }
576 if (egid != (gid_t) -1) { 586 if (egid != (gid_t) -1) {
577 if (old->gid == egid || 587 if (gid_eq(old->gid, kegid) ||
578 old->egid == egid || 588 gid_eq(old->egid, kegid) ||
579 old->sgid == egid || 589 gid_eq(old->sgid, kegid) ||
580 nsown_capable(CAP_SETGID)) 590 nsown_capable(CAP_SETGID))
581 new->egid = egid; 591 new->egid = kegid;
582 else 592 else
583 goto error; 593 goto error;
584 } 594 }
585 595
586 if (rgid != (gid_t) -1 || 596 if (rgid != (gid_t) -1 ||
587 (egid != (gid_t) -1 && egid != old->gid)) 597 (egid != (gid_t) -1 && !gid_eq(kegid, old->gid)))
588 new->sgid = new->egid; 598 new->sgid = new->egid;
589 new->fsgid = new->egid; 599 new->fsgid = new->egid;
590 600
@@ -602,9 +612,15 @@ error:
602 */ 612 */
603SYSCALL_DEFINE1(setgid, gid_t, gid) 613SYSCALL_DEFINE1(setgid, gid_t, gid)
604{ 614{
615 struct user_namespace *ns = current_user_ns();
605 const struct cred *old; 616 const struct cred *old;
606 struct cred *new; 617 struct cred *new;
607 int retval; 618 int retval;
619 kgid_t kgid;
620
621 kgid = make_kgid(ns, gid);
622 if (!gid_valid(kgid))
623 return -EINVAL;
608 624
609 new = prepare_creds(); 625 new = prepare_creds();
610 if (!new) 626 if (!new)
@@ -613,9 +629,9 @@ SYSCALL_DEFINE1(setgid, gid_t, gid)
613 629
614 retval = -EPERM; 630 retval = -EPERM;
615 if (nsown_capable(CAP_SETGID)) 631 if (nsown_capable(CAP_SETGID))
616 new->gid = new->egid = new->sgid = new->fsgid = gid; 632 new->gid = new->egid = new->sgid = new->fsgid = kgid;
617 else if (gid == old->gid || gid == old->sgid) 633 else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid))
618 new->egid = new->fsgid = gid; 634 new->egid = new->fsgid = kgid;
619 else 635 else
620 goto error; 636 goto error;
621 637
@@ -672,9 +688,19 @@ static int set_user(struct cred *new)
672 */ 688 */
673SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid) 689SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
674{ 690{
691 struct user_namespace *ns = current_user_ns();
675 const struct cred *old; 692 const struct cred *old;
676 struct cred *new; 693 struct cred *new;
677 int retval; 694 int retval;
695 kuid_t kruid, keuid;
696
697 kruid = make_kuid(ns, ruid);
698 keuid = make_kuid(ns, euid);
699
700 if ((ruid != (uid_t) -1) && !uid_valid(kruid))
701 return -EINVAL;
702 if ((euid != (uid_t) -1) && !uid_valid(keuid))
703 return -EINVAL;
678 704
679 new = prepare_creds(); 705 new = prepare_creds();
680 if (!new) 706 if (!new)
@@ -683,29 +709,29 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
683 709
684 retval = -EPERM; 710 retval = -EPERM;
685 if (ruid != (uid_t) -1) { 711 if (ruid != (uid_t) -1) {
686 new->uid = ruid; 712 new->uid = kruid;
687 if (old->uid != ruid && 713 if (!uid_eq(old->uid, kruid) &&
688 old->euid != ruid && 714 !uid_eq(old->euid, kruid) &&
689 !nsown_capable(CAP_SETUID)) 715 !nsown_capable(CAP_SETUID))
690 goto error; 716 goto error;
691 } 717 }
692 718
693 if (euid != (uid_t) -1) { 719 if (euid != (uid_t) -1) {
694 new->euid = euid; 720 new->euid = keuid;
695 if (old->uid != euid && 721 if (!uid_eq(old->uid, keuid) &&
696 old->euid != euid && 722 !uid_eq(old->euid, keuid) &&
697 old->suid != euid && 723 !uid_eq(old->suid, keuid) &&
698 !nsown_capable(CAP_SETUID)) 724 !nsown_capable(CAP_SETUID))
699 goto error; 725 goto error;
700 } 726 }
701 727
702 if (new->uid != old->uid) { 728 if (!uid_eq(new->uid, old->uid)) {
703 retval = set_user(new); 729 retval = set_user(new);
704 if (retval < 0) 730 if (retval < 0)
705 goto error; 731 goto error;
706 } 732 }
707 if (ruid != (uid_t) -1 || 733 if (ruid != (uid_t) -1 ||
708 (euid != (uid_t) -1 && euid != old->uid)) 734 (euid != (uid_t) -1 && !uid_eq(keuid, old->uid)))
709 new->suid = new->euid; 735 new->suid = new->euid;
710 new->fsuid = new->euid; 736 new->fsuid = new->euid;
711 737
@@ -733,9 +759,15 @@ error:
733 */ 759 */
734SYSCALL_DEFINE1(setuid, uid_t, uid) 760SYSCALL_DEFINE1(setuid, uid_t, uid)
735{ 761{
762 struct user_namespace *ns = current_user_ns();
736 const struct cred *old; 763 const struct cred *old;
737 struct cred *new; 764 struct cred *new;
738 int retval; 765 int retval;
766 kuid_t kuid;
767
768 kuid = make_kuid(ns, uid);
769 if (!uid_valid(kuid))
770 return -EINVAL;
739 771
740 new = prepare_creds(); 772 new = prepare_creds();
741 if (!new) 773 if (!new)
@@ -744,17 +776,17 @@ SYSCALL_DEFINE1(setuid, uid_t, uid)
744 776
745 retval = -EPERM; 777 retval = -EPERM;
746 if (nsown_capable(CAP_SETUID)) { 778 if (nsown_capable(CAP_SETUID)) {
747 new->suid = new->uid = uid; 779 new->suid = new->uid = kuid;
748 if (uid != old->uid) { 780 if (!uid_eq(kuid, old->uid)) {
749 retval = set_user(new); 781 retval = set_user(new);
750 if (retval < 0) 782 if (retval < 0)
751 goto error; 783 goto error;
752 } 784 }
753 } else if (uid != old->uid && uid != new->suid) { 785 } else if (!uid_eq(kuid, old->uid) && !uid_eq(kuid, new->suid)) {
754 goto error; 786 goto error;
755 } 787 }
756 788
757 new->fsuid = new->euid = uid; 789 new->fsuid = new->euid = kuid;
758 790
759 retval = security_task_fix_setuid(new, old, LSM_SETID_ID); 791 retval = security_task_fix_setuid(new, old, LSM_SETID_ID);
760 if (retval < 0) 792 if (retval < 0)
@@ -774,9 +806,24 @@ error:
774 */ 806 */
775SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid) 807SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
776{ 808{
809 struct user_namespace *ns = current_user_ns();
777 const struct cred *old; 810 const struct cred *old;
778 struct cred *new; 811 struct cred *new;
779 int retval; 812 int retval;
813 kuid_t kruid, keuid, ksuid;
814
815 kruid = make_kuid(ns, ruid);
816 keuid = make_kuid(ns, euid);
817 ksuid = make_kuid(ns, suid);
818
819 if ((ruid != (uid_t) -1) && !uid_valid(kruid))
820 return -EINVAL;
821
822 if ((euid != (uid_t) -1) && !uid_valid(keuid))
823 return -EINVAL;
824
825 if ((suid != (uid_t) -1) && !uid_valid(ksuid))
826 return -EINVAL;
780 827
781 new = prepare_creds(); 828 new = prepare_creds();
782 if (!new) 829 if (!new)
@@ -786,29 +833,29 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
786 833
787 retval = -EPERM; 834 retval = -EPERM;
788 if (!nsown_capable(CAP_SETUID)) { 835 if (!nsown_capable(CAP_SETUID)) {
789 if (ruid != (uid_t) -1 && ruid != old->uid && 836 if (ruid != (uid_t) -1 && !uid_eq(kruid, old->uid) &&
790 ruid != old->euid && ruid != old->suid) 837 !uid_eq(kruid, old->euid) && !uid_eq(kruid, old->suid))
791 goto error; 838 goto error;
792 if (euid != (uid_t) -1 && euid != old->uid && 839 if (euid != (uid_t) -1 && !uid_eq(keuid, old->uid) &&
793 euid != old->euid && euid != old->suid) 840 !uid_eq(keuid, old->euid) && !uid_eq(keuid, old->suid))
794 goto error; 841 goto error;
795 if (suid != (uid_t) -1 && suid != old->uid && 842 if (suid != (uid_t) -1 && !uid_eq(ksuid, old->uid) &&
796 suid != old->euid && suid != old->suid) 843 !uid_eq(ksuid, old->euid) && !uid_eq(ksuid, old->suid))
797 goto error; 844 goto error;
798 } 845 }
799 846
800 if (ruid != (uid_t) -1) { 847 if (ruid != (uid_t) -1) {
801 new->uid = ruid; 848 new->uid = kruid;
802 if (ruid != old->uid) { 849 if (!uid_eq(kruid, old->uid)) {
803 retval = set_user(new); 850 retval = set_user(new);
804 if (retval < 0) 851 if (retval < 0)
805 goto error; 852 goto error;
806 } 853 }
807 } 854 }
808 if (euid != (uid_t) -1) 855 if (euid != (uid_t) -1)
809 new->euid = euid; 856 new->euid = keuid;
810 if (suid != (uid_t) -1) 857 if (suid != (uid_t) -1)
811 new->suid = suid; 858 new->suid = ksuid;
812 new->fsuid = new->euid; 859 new->fsuid = new->euid;
813 860
814 retval = security_task_fix_setuid(new, old, LSM_SETID_RES); 861 retval = security_task_fix_setuid(new, old, LSM_SETID_RES);
@@ -822,14 +869,19 @@ error:
822 return retval; 869 return retval;
823} 870}
824 871
825SYSCALL_DEFINE3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid) 872SYSCALL_DEFINE3(getresuid, uid_t __user *, ruidp, uid_t __user *, euidp, uid_t __user *, suidp)
826{ 873{
827 const struct cred *cred = current_cred(); 874 const struct cred *cred = current_cred();
828 int retval; 875 int retval;
876 uid_t ruid, euid, suid;
877
878 ruid = from_kuid_munged(cred->user_ns, cred->uid);
879 euid = from_kuid_munged(cred->user_ns, cred->euid);
880 suid = from_kuid_munged(cred->user_ns, cred->suid);
829 881
830 if (!(retval = put_user(cred->uid, ruid)) && 882 if (!(retval = put_user(ruid, ruidp)) &&
831 !(retval = put_user(cred->euid, euid))) 883 !(retval = put_user(euid, euidp)))
832 retval = put_user(cred->suid, suid); 884 retval = put_user(suid, suidp);
833 885
834 return retval; 886 return retval;
835} 887}
@@ -839,9 +891,22 @@ SYSCALL_DEFINE3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __u
839 */ 891 */
840SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid) 892SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
841{ 893{
894 struct user_namespace *ns = current_user_ns();
842 const struct cred *old; 895 const struct cred *old;
843 struct cred *new; 896 struct cred *new;
844 int retval; 897 int retval;
898 kgid_t krgid, kegid, ksgid;
899
900 krgid = make_kgid(ns, rgid);
901 kegid = make_kgid(ns, egid);
902 ksgid = make_kgid(ns, sgid);
903
904 if ((rgid != (gid_t) -1) && !gid_valid(krgid))
905 return -EINVAL;
906 if ((egid != (gid_t) -1) && !gid_valid(kegid))
907 return -EINVAL;
908 if ((sgid != (gid_t) -1) && !gid_valid(ksgid))
909 return -EINVAL;
845 910
846 new = prepare_creds(); 911 new = prepare_creds();
847 if (!new) 912 if (!new)
@@ -850,23 +915,23 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
850 915
851 retval = -EPERM; 916 retval = -EPERM;
852 if (!nsown_capable(CAP_SETGID)) { 917 if (!nsown_capable(CAP_SETGID)) {
853 if (rgid != (gid_t) -1 && rgid != old->gid && 918 if (rgid != (gid_t) -1 && !gid_eq(krgid, old->gid) &&
854 rgid != old->egid && rgid != old->sgid) 919 !gid_eq(krgid, old->egid) && !gid_eq(krgid, old->sgid))
855 goto error; 920 goto error;
856 if (egid != (gid_t) -1 && egid != old->gid && 921 if (egid != (gid_t) -1 && !gid_eq(kegid, old->gid) &&
857 egid != old->egid && egid != old->sgid) 922 !gid_eq(kegid, old->egid) && !gid_eq(kegid, old->sgid))
858 goto error; 923 goto error;
859 if (sgid != (gid_t) -1 && sgid != old->gid && 924 if (sgid != (gid_t) -1 && !gid_eq(ksgid, old->gid) &&
860 sgid != old->egid && sgid != old->sgid) 925 !gid_eq(ksgid, old->egid) && !gid_eq(ksgid, old->sgid))
861 goto error; 926 goto error;
862 } 927 }
863 928
864 if (rgid != (gid_t) -1) 929 if (rgid != (gid_t) -1)
865 new->gid = rgid; 930 new->gid = krgid;
866 if (egid != (gid_t) -1) 931 if (egid != (gid_t) -1)
867 new->egid = egid; 932 new->egid = kegid;
868 if (sgid != (gid_t) -1) 933 if (sgid != (gid_t) -1)
869 new->sgid = sgid; 934 new->sgid = ksgid;
870 new->fsgid = new->egid; 935 new->fsgid = new->egid;
871 936
872 return commit_creds(new); 937 return commit_creds(new);
@@ -876,14 +941,19 @@ error:
876 return retval; 941 return retval;
877} 942}
878 943
879SYSCALL_DEFINE3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid) 944SYSCALL_DEFINE3(getresgid, gid_t __user *, rgidp, gid_t __user *, egidp, gid_t __user *, sgidp)
880{ 945{
881 const struct cred *cred = current_cred(); 946 const struct cred *cred = current_cred();
882 int retval; 947 int retval;
948 gid_t rgid, egid, sgid;
949
950 rgid = from_kgid_munged(cred->user_ns, cred->gid);
951 egid = from_kgid_munged(cred->user_ns, cred->egid);
952 sgid = from_kgid_munged(cred->user_ns, cred->sgid);
883 953
884 if (!(retval = put_user(cred->gid, rgid)) && 954 if (!(retval = put_user(rgid, rgidp)) &&
885 !(retval = put_user(cred->egid, egid))) 955 !(retval = put_user(egid, egidp)))
886 retval = put_user(cred->sgid, sgid); 956 retval = put_user(sgid, sgidp);
887 957
888 return retval; 958 return retval;
889} 959}
@@ -900,18 +970,24 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid)
900 const struct cred *old; 970 const struct cred *old;
901 struct cred *new; 971 struct cred *new;
902 uid_t old_fsuid; 972 uid_t old_fsuid;
973 kuid_t kuid;
974
975 old = current_cred();
976 old_fsuid = from_kuid_munged(old->user_ns, old->fsuid);
977
978 kuid = make_kuid(old->user_ns, uid);
979 if (!uid_valid(kuid))
980 return old_fsuid;
903 981
904 new = prepare_creds(); 982 new = prepare_creds();
905 if (!new) 983 if (!new)
906 return current_fsuid(); 984 return old_fsuid;
907 old = current_cred();
908 old_fsuid = old->fsuid;
909 985
910 if (uid == old->uid || uid == old->euid || 986 if (uid_eq(kuid, old->uid) || uid_eq(kuid, old->euid) ||
911 uid == old->suid || uid == old->fsuid || 987 uid_eq(kuid, old->suid) || uid_eq(kuid, old->fsuid) ||
912 nsown_capable(CAP_SETUID)) { 988 nsown_capable(CAP_SETUID)) {
913 if (uid != old_fsuid) { 989 if (!uid_eq(kuid, old->fsuid)) {
914 new->fsuid = uid; 990 new->fsuid = kuid;
915 if (security_task_fix_setuid(new, old, LSM_SETID_FS) == 0) 991 if (security_task_fix_setuid(new, old, LSM_SETID_FS) == 0)
916 goto change_okay; 992 goto change_okay;
917 } 993 }
@@ -933,18 +1009,24 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid)
933 const struct cred *old; 1009 const struct cred *old;
934 struct cred *new; 1010 struct cred *new;
935 gid_t old_fsgid; 1011 gid_t old_fsgid;
1012 kgid_t kgid;
1013
1014 old = current_cred();
1015 old_fsgid = from_kgid_munged(old->user_ns, old->fsgid);
1016
1017 kgid = make_kgid(old->user_ns, gid);
1018 if (!gid_valid(kgid))
1019 return old_fsgid;
936 1020
937 new = prepare_creds(); 1021 new = prepare_creds();
938 if (!new) 1022 if (!new)
939 return current_fsgid(); 1023 return old_fsgid;
940 old = current_cred();
941 old_fsgid = old->fsgid;
942 1024
943 if (gid == old->gid || gid == old->egid || 1025 if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->egid) ||
944 gid == old->sgid || gid == old->fsgid || 1026 gid_eq(kgid, old->sgid) || gid_eq(kgid, old->fsgid) ||
945 nsown_capable(CAP_SETGID)) { 1027 nsown_capable(CAP_SETGID)) {
946 if (gid != old_fsgid) { 1028 if (!gid_eq(kgid, old->fsgid)) {
947 new->fsgid = gid; 1029 new->fsgid = kgid;
948 goto change_okay; 1030 goto change_okay;
949 } 1031 }
950 } 1032 }
@@ -1503,10 +1585,10 @@ static int check_prlimit_permission(struct task_struct *task)
1503 if (cred->user_ns == tcred->user_ns && 1585 if (cred->user_ns == tcred->user_ns &&
1504 (cred->uid == tcred->euid && 1586 (cred->uid == tcred->euid &&
1505 cred->uid == tcred->suid && 1587 cred->uid == tcred->suid &&
1506 cred->uid == tcred->uid && 1588 cred->uid == tcred->uid &&
1507 cred->gid == tcred->egid && 1589 cred->gid == tcred->egid &&
1508 cred->gid == tcred->sgid && 1590 cred->gid == tcred->sgid &&
1509 cred->gid == tcred->gid)) 1591 cred->gid == tcred->gid))
1510 return 0; 1592 return 0;
1511 if (ns_capable(tcred->user_ns, CAP_SYS_RESOURCE)) 1593 if (ns_capable(tcred->user_ns, CAP_SYS_RESOURCE))
1512 return 0; 1594 return 0;
diff --git a/kernel/timer.c b/kernel/timer.c
index a297ffcf888..67316cb6a77 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1427,25 +1427,25 @@ SYSCALL_DEFINE0(getppid)
1427SYSCALL_DEFINE0(getuid) 1427SYSCALL_DEFINE0(getuid)
1428{ 1428{
1429 /* Only we change this so SMP safe */ 1429 /* Only we change this so SMP safe */
1430 return current_uid(); 1430 return from_kuid_munged(current_user_ns(), current_uid());
1431} 1431}
1432 1432
1433SYSCALL_DEFINE0(geteuid) 1433SYSCALL_DEFINE0(geteuid)
1434{ 1434{
1435 /* Only we change this so SMP safe */ 1435 /* Only we change this so SMP safe */
1436 return current_euid(); 1436 return from_kuid_munged(current_user_ns(), current_euid());
1437} 1437}
1438 1438
1439SYSCALL_DEFINE0(getgid) 1439SYSCALL_DEFINE0(getgid)
1440{ 1440{
1441 /* Only we change this so SMP safe */ 1441 /* Only we change this so SMP safe */
1442 return current_gid(); 1442 return from_kgid_munged(current_user_ns(), current_gid());
1443} 1443}
1444 1444
1445SYSCALL_DEFINE0(getegid) 1445SYSCALL_DEFINE0(getegid)
1446{ 1446{
1447 /* Only we change this so SMP safe */ 1447 /* Only we change this so SMP safe */
1448 return current_egid(); 1448 return from_kgid_munged(current_user_ns(), current_egid());
1449} 1449}
1450 1450
1451#endif 1451#endif
diff --git a/kernel/uid16.c b/kernel/uid16.c
index e530bc34c4c..d7948eb1022 100644
--- a/kernel/uid16.c
+++ b/kernel/uid16.c
@@ -81,14 +81,19 @@ SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
81 return ret; 81 return ret;
82} 82}
83 83
84SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruid, old_uid_t __user *, euid, old_uid_t __user *, suid) 84SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp)
85{ 85{
86 const struct cred *cred = current_cred(); 86 const struct cred *cred = current_cred();
87 int retval; 87 int retval;
88 old_uid_t ruid, euid, suid;
88 89
89 if (!(retval = put_user(high2lowuid(cred->uid), ruid)) && 90 ruid = high2lowuid(from_kuid_munged(cred->user_ns, cred->uid));
90 !(retval = put_user(high2lowuid(cred->euid), euid))) 91 euid = high2lowuid(from_kuid_munged(cred->user_ns, cred->euid));
91 retval = put_user(high2lowuid(cred->suid), suid); 92 suid = high2lowuid(from_kuid_munged(cred->user_ns, cred->suid));
93
94 if (!(retval = put_user(ruid, ruidp)) &&
95 !(retval = put_user(euid, euidp)))
96 retval = put_user(suid, suidp);
92 97
93 return retval; 98 return retval;
94} 99}
@@ -103,14 +108,19 @@ SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
103} 108}
104 109
105 110
106SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgid, old_gid_t __user *, egid, old_gid_t __user *, sgid) 111SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp)
107{ 112{
108 const struct cred *cred = current_cred(); 113 const struct cred *cred = current_cred();
109 int retval; 114 int retval;
115 old_gid_t rgid, egid, sgid;
116
117 rgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->gid));
118 egid = high2lowgid(from_kgid_munged(cred->user_ns, cred->egid));
119 sgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->sgid));
110 120
111 if (!(retval = put_user(high2lowgid(cred->gid), rgid)) && 121 if (!(retval = put_user(rgid, rgidp)) &&
112 !(retval = put_user(high2lowgid(cred->egid), egid))) 122 !(retval = put_user(egid, egidp)))
113 retval = put_user(high2lowgid(cred->sgid), sgid); 123 retval = put_user(sgid, sgidp);
114 124
115 return retval; 125 return retval;
116} 126}
@@ -221,20 +231,20 @@ SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
221 231
222SYSCALL_DEFINE0(getuid16) 232SYSCALL_DEFINE0(getuid16)
223{ 233{
224 return high2lowuid(current_uid()); 234 return high2lowuid(from_kuid_munged(current_user_ns(), current_uid()));
225} 235}
226 236
227SYSCALL_DEFINE0(geteuid16) 237SYSCALL_DEFINE0(geteuid16)
228{ 238{
229 return high2lowuid(current_euid()); 239 return high2lowuid(from_kuid_munged(current_user_ns(), current_euid()));
230} 240}
231 241
232SYSCALL_DEFINE0(getgid16) 242SYSCALL_DEFINE0(getgid16)
233{ 243{
234 return high2lowgid(current_gid()); 244 return high2lowgid(from_kgid_munged(current_user_ns(), current_gid()));
235} 245}
236 246
237SYSCALL_DEFINE0(getegid16) 247SYSCALL_DEFINE0(getegid16)
238{ 248{
239 return high2lowgid(current_egid()); 249 return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));
240} 250}