Commit a29c33f4 authored by Eric W. Biederman's avatar Eric W. Biederman

userns: Convert setting and getting uid and gid system calls to use kuid and kgid

Convert setregid, setgid, setreuid, setuid,
setresuid, getresuid, setresgid, getresgid, setfsuid, setfsgid,
getuid, geteuid, getgid, getegid,
waitpid, waitid, wait4.

Convert userspace uids and gids into kuids and kgids before
being placed on struct cred.  Convert struct cred kuids and
kgids into userspace uids and gids when returning them.
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
parent 18815a18
...@@ -1214,7 +1214,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p) ...@@ -1214,7 +1214,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
unsigned long state; unsigned long state;
int retval, status, traced; int retval, status, traced;
pid_t pid = task_pid_vnr(p); pid_t pid = task_pid_vnr(p);
uid_t uid = __task_cred(p)->uid; uid_t uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid);
struct siginfo __user *infop; struct siginfo __user *infop;
if (!likely(wo->wo_flags & WEXITED)) if (!likely(wo->wo_flags & WEXITED))
...@@ -1427,7 +1427,7 @@ static int wait_task_stopped(struct wait_opts *wo, ...@@ -1427,7 +1427,7 @@ static int wait_task_stopped(struct wait_opts *wo,
if (!unlikely(wo->wo_flags & WNOWAIT)) if (!unlikely(wo->wo_flags & WNOWAIT))
*p_code = 0; *p_code = 0;
uid = task_uid(p); uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid);
unlock_sig: unlock_sig:
spin_unlock_irq(&p->sighand->siglock); spin_unlock_irq(&p->sighand->siglock);
if (!exit_code) if (!exit_code)
...@@ -1500,7 +1500,7 @@ static int wait_task_continued(struct wait_opts *wo, struct task_struct *p) ...@@ -1500,7 +1500,7 @@ static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
} }
if (!unlikely(wo->wo_flags & WNOWAIT)) if (!unlikely(wo->wo_flags & WNOWAIT))
p->signal->flags &= ~SIGNAL_STOP_CONTINUED; p->signal->flags &= ~SIGNAL_STOP_CONTINUED;
uid = task_uid(p); uid = from_kuid_munged(current_user_ns(), __task_cred(p)->uid);
spin_unlock_irq(&p->sighand->siglock); spin_unlock_irq(&p->sighand->siglock);
pid = task_pid_vnr(p); pid = task_pid_vnr(p);
......
This diff is collapsed.
...@@ -1427,25 +1427,25 @@ SYSCALL_DEFINE0(getppid) ...@@ -1427,25 +1427,25 @@ SYSCALL_DEFINE0(getppid)
SYSCALL_DEFINE0(getuid) SYSCALL_DEFINE0(getuid)
{ {
/* Only we change this so SMP safe */ /* Only we change this so SMP safe */
return current_uid(); return from_kuid_munged(current_user_ns(), current_uid());
} }
SYSCALL_DEFINE0(geteuid) SYSCALL_DEFINE0(geteuid)
{ {
/* Only we change this so SMP safe */ /* Only we change this so SMP safe */
return current_euid(); return from_kuid_munged(current_user_ns(), current_euid());
} }
SYSCALL_DEFINE0(getgid) SYSCALL_DEFINE0(getgid)
{ {
/* Only we change this so SMP safe */ /* Only we change this so SMP safe */
return current_gid(); return from_kgid_munged(current_user_ns(), current_gid());
} }
SYSCALL_DEFINE0(getegid) SYSCALL_DEFINE0(getegid)
{ {
/* Only we change this so SMP safe */ /* Only we change this so SMP safe */
return current_egid(); return from_kgid_munged(current_user_ns(), current_egid());
} }
#endif #endif
......
...@@ -81,14 +81,19 @@ SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) ...@@ -81,14 +81,19 @@ SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
return ret; return ret;
} }
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruid, old_uid_t __user *, euid, old_uid_t __user *, suid) SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp)
{ {
const struct cred *cred = current_cred(); const struct cred *cred = current_cred();
int retval; int retval;
old_uid_t ruid, euid, suid;
if (!(retval = put_user(high2lowuid(cred->uid), ruid)) && ruid = high2lowuid(from_kuid_munged(cred->user_ns, cred->uid));
!(retval = put_user(high2lowuid(cred->euid), euid))) euid = high2lowuid(from_kuid_munged(cred->user_ns, cred->euid));
retval = put_user(high2lowuid(cred->suid), suid); suid = high2lowuid(from_kuid_munged(cred->user_ns, cred->suid));
if (!(retval = put_user(ruid, ruidp)) &&
!(retval = put_user(euid, euidp)))
retval = put_user(suid, suidp);
return retval; return retval;
} }
...@@ -103,14 +108,19 @@ SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) ...@@ -103,14 +108,19 @@ SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
} }
SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgid, old_gid_t __user *, egid, old_gid_t __user *, sgid) SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp)
{ {
const struct cred *cred = current_cred(); const struct cred *cred = current_cred();
int retval; int retval;
old_gid_t rgid, egid, sgid;
rgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->gid));
egid = high2lowgid(from_kgid_munged(cred->user_ns, cred->egid));
sgid = high2lowgid(from_kgid_munged(cred->user_ns, cred->sgid));
if (!(retval = put_user(high2lowgid(cred->gid), rgid)) && if (!(retval = put_user(rgid, rgidp)) &&
!(retval = put_user(high2lowgid(cred->egid), egid))) !(retval = put_user(egid, egidp)))
retval = put_user(high2lowgid(cred->sgid), sgid); retval = put_user(sgid, sgidp);
return retval; return retval;
} }
...@@ -221,20 +231,20 @@ SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist) ...@@ -221,20 +231,20 @@ SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
SYSCALL_DEFINE0(getuid16) SYSCALL_DEFINE0(getuid16)
{ {
return high2lowuid(current_uid()); return high2lowuid(from_kuid_munged(current_user_ns(), current_uid()));
} }
SYSCALL_DEFINE0(geteuid16) SYSCALL_DEFINE0(geteuid16)
{ {
return high2lowuid(current_euid()); return high2lowuid(from_kuid_munged(current_user_ns(), current_euid()));
} }
SYSCALL_DEFINE0(getgid16) SYSCALL_DEFINE0(getgid16)
{ {
return high2lowgid(current_gid()); return high2lowgid(from_kgid_munged(current_user_ns(), current_gid()));
} }
SYSCALL_DEFINE0(getegid16) SYSCALL_DEFINE0(getegid16)
{ {
return high2lowgid(current_egid()); return high2lowgid(from_kgid_munged(current_user_ns(), current_egid()));
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment