|
@@ -69,6 +69,8 @@
|
|
|
#include <asm/io.h>
|
|
|
#include <asm/unistd.h>
|
|
|
|
|
|
+#include "uid16.h"
|
|
|
+
|
|
|
#ifndef SET_UNALIGN_CTL
|
|
|
# define SET_UNALIGN_CTL(a, b) (-EINVAL)
|
|
|
#endif
|
|
@@ -340,7 +342,7 @@ out_unlock:
|
|
|
* operations (as far as semantic preservation is concerned).
|
|
|
*/
|
|
|
#ifdef CONFIG_MULTIUSER
|
|
|
-SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
|
|
|
+long __sys_setregid(gid_t rgid, gid_t egid)
|
|
|
{
|
|
|
struct user_namespace *ns = current_user_ns();
|
|
|
const struct cred *old;
|
|
@@ -392,12 +394,17 @@ error:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
|
|
|
+{
|
|
|
+ return __sys_setregid(rgid, egid);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* setgid() is implemented like SysV w/ SAVED_IDS
|
|
|
*
|
|
|
* SMP: Same implicit races as above.
|
|
|
*/
|
|
|
-SYSCALL_DEFINE1(setgid, gid_t, gid)
|
|
|
+long __sys_setgid(gid_t gid)
|
|
|
{
|
|
|
struct user_namespace *ns = current_user_ns();
|
|
|
const struct cred *old;
|
|
@@ -429,6 +436,11 @@ error:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE1(setgid, gid_t, gid)
|
|
|
+{
|
|
|
+ return __sys_setgid(gid);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* change the user struct in a credentials set to match the new UID
|
|
|
*/
|
|
@@ -473,7 +485,7 @@ static int set_user(struct cred *new)
|
|
|
* 100% compatible with BSD. A program which uses just setuid() will be
|
|
|
* 100% compatible with POSIX with saved IDs.
|
|
|
*/
|
|
|
-SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
|
|
|
+long __sys_setreuid(uid_t ruid, uid_t euid)
|
|
|
{
|
|
|
struct user_namespace *ns = current_user_ns();
|
|
|
const struct cred *old;
|
|
@@ -533,6 +545,11 @@ error:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
|
|
|
+{
|
|
|
+ return __sys_setreuid(ruid, euid);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* setuid() is implemented like SysV with SAVED_IDS
|
|
|
*
|
|
@@ -544,7 +561,7 @@ error:
|
|
|
* will allow a root program to temporarily drop privileges and be able to
|
|
|
* regain them by swapping the real and effective uid.
|
|
|
*/
|
|
|
-SYSCALL_DEFINE1(setuid, uid_t, uid)
|
|
|
+long __sys_setuid(uid_t uid)
|
|
|
{
|
|
|
struct user_namespace *ns = current_user_ns();
|
|
|
const struct cred *old;
|
|
@@ -586,12 +603,17 @@ error:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE1(setuid, uid_t, uid)
|
|
|
+{
|
|
|
+ return __sys_setuid(uid);
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/*
|
|
|
* This function implements a generic ability to update ruid, euid,
|
|
|
* and suid. This allows you to implement the 4.4 compatible seteuid().
|
|
|
*/
|
|
|
-SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
|
|
|
+long __sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
|
|
|
{
|
|
|
struct user_namespace *ns = current_user_ns();
|
|
|
const struct cred *old;
|
|
@@ -656,6 +678,11 @@ error:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
|
|
|
+{
|
|
|
+ return __sys_setresuid(ruid, euid, suid);
|
|
|
+}
|
|
|
+
|
|
|
SYSCALL_DEFINE3(getresuid, uid_t __user *, ruidp, uid_t __user *, euidp, uid_t __user *, suidp)
|
|
|
{
|
|
|
const struct cred *cred = current_cred();
|
|
@@ -678,7 +705,7 @@ SYSCALL_DEFINE3(getresuid, uid_t __user *, ruidp, uid_t __user *, euidp, uid_t _
|
|
|
/*
|
|
|
* Same as above, but for rgid, egid, sgid.
|
|
|
*/
|
|
|
-SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
|
|
|
+long __sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
|
|
|
{
|
|
|
struct user_namespace *ns = current_user_ns();
|
|
|
const struct cred *old;
|
|
@@ -730,6 +757,11 @@ error:
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
|
|
|
+{
|
|
|
+ return __sys_setresgid(rgid, egid, sgid);
|
|
|
+}
|
|
|
+
|
|
|
SYSCALL_DEFINE3(getresgid, gid_t __user *, rgidp, gid_t __user *, egidp, gid_t __user *, sgidp)
|
|
|
{
|
|
|
const struct cred *cred = current_cred();
|
|
@@ -757,7 +789,7 @@ SYSCALL_DEFINE3(getresgid, gid_t __user *, rgidp, gid_t __user *, egidp, gid_t _
|
|
|
* whatever uid it wants to). It normally shadows "euid", except when
|
|
|
* explicitly set by setfsuid() or for access..
|
|
|
*/
|
|
|
-SYSCALL_DEFINE1(setfsuid, uid_t, uid)
|
|
|
+long __sys_setfsuid(uid_t uid)
|
|
|
{
|
|
|
const struct cred *old;
|
|
|
struct cred *new;
|
|
@@ -793,10 +825,15 @@ change_okay:
|
|
|
return old_fsuid;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE1(setfsuid, uid_t, uid)
|
|
|
+{
|
|
|
+ return __sys_setfsuid(uid);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Samma på svenska..
|
|
|
*/
|
|
|
-SYSCALL_DEFINE1(setfsgid, gid_t, gid)
|
|
|
+long __sys_setfsgid(gid_t gid)
|
|
|
{
|
|
|
const struct cred *old;
|
|
|
struct cred *new;
|
|
@@ -830,6 +867,11 @@ change_okay:
|
|
|
commit_creds(new);
|
|
|
return old_fsgid;
|
|
|
}
|
|
|
+
|
|
|
+SYSCALL_DEFINE1(setfsgid, gid_t, gid)
|
|
|
+{
|
|
|
+ return __sys_setfsgid(gid);
|
|
|
+}
|
|
|
#endif /* CONFIG_MULTIUSER */
|
|
|
|
|
|
/**
|