diff --git a/src/kernel/emulation/linux/CMakeLists.txt b/src/kernel/emulation/linux/CMakeLists.txt index aa28d6641..158152409 100644 --- a/src/kernel/emulation/linux/CMakeLists.txt +++ b/src/kernel/emulation/linux/CMakeLists.txt @@ -79,10 +79,12 @@ set(emulation_sources unistd/getegid.c unistd/setgid.c unistd/setuid.c + unistd/settid.c unistd/setegid.c unistd/seteuid.c unistd/setsid.c unistd/getuid.c + unistd/gettid.c unistd/geteuid.c unistd/getpid.c unistd/lseek.c diff --git a/src/kernel/emulation/linux/syscalls.c b/src/kernel/emulation/linux/syscalls.c index 561567fcd..406d96523 100644 --- a/src/kernel/emulation/linux/syscalls.c +++ b/src/kernel/emulation/linux/syscalls.c @@ -41,6 +41,8 @@ #include "unistd/seteuid.h" #include "unistd/setsid.h" #include "unistd/setuid.h" +#include "unistd/settid.h" +#include "unistd/gettid.h" #include "unistd/getuid.h" #include "unistd/geteuid.h" #include "unistd/pread.h" @@ -348,6 +350,8 @@ void* __bsd_syscall_table[600] = { [274] = sys_sysctlbyname, [282] = sys_chmod_extended, [283] = sys_fchmod_extended, + [285] = sys_settid, + [286] = sys_gettid, [294] = sys_shared_region_check_np, [301] = sys_psynch_mutexwait, [302] = sys_psynch_mutexdrop, diff --git a/src/kernel/emulation/linux/unistd/getegid.c b/src/kernel/emulation/linux/unistd/getegid.c index 19d9b9cb7..d437227cc 100644 --- a/src/kernel/emulation/linux/unistd/getegid.c +++ b/src/kernel/emulation/linux/unistd/getegid.c @@ -6,6 +6,8 @@ long sys_getegid(void) { - return lkm_call(NR_getgid, NULL); + struct uidgid ug; + lkm_call(NR_getuidgid, &ug); + return ug.uid; } diff --git a/src/kernel/emulation/linux/unistd/geteuid.c b/src/kernel/emulation/linux/unistd/geteuid.c index f719415fb..12ef220fe 100644 --- a/src/kernel/emulation/linux/unistd/geteuid.c +++ b/src/kernel/emulation/linux/unistd/geteuid.c @@ -6,6 +6,8 @@ long sys_geteuid(void) { - return lkm_call(NR_getuid, NULL); + struct uidgid ug; + lkm_call(NR_getuidgid, &ug); + return ug.uid; } diff --git a/src/kernel/emulation/linux/unistd/getgid.c b/src/kernel/emulation/linux/unistd/getgid.c index dbbdbd0cb..d6e96b1a6 100644 --- a/src/kernel/emulation/linux/unistd/getgid.c +++ b/src/kernel/emulation/linux/unistd/getgid.c @@ -6,6 +6,8 @@ long sys_getgid(void) { - return lkm_call(NR_getgid, NULL); + struct uidgid ug; + lkm_call(NR_getuidgid, &ug); + return ug.gid; } diff --git a/src/kernel/emulation/linux/unistd/gettid.c b/src/kernel/emulation/linux/unistd/gettid.c new file mode 100644 index 000000000..b8e4a63c2 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/gettid.c @@ -0,0 +1,20 @@ +#include "gettid.h" +#include "../base.h" +#include +#include "../mach/lkm.h" +#include "../../../../lkm/api.h" + +long sys_gettid(int* uid, int* gid) +{ + struct uidgid ug; + lkm_call(NR_getuidgid, &ug); + + if (uid) + *uid = ug.uid; + + if (gid) + *gid = ug.gid; + + return 0; +} + diff --git a/src/kernel/emulation/linux/unistd/gettid.h b/src/kernel/emulation/linux/unistd/gettid.h new file mode 100644 index 000000000..36e83d567 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/gettid.h @@ -0,0 +1,7 @@ +#ifndef LINUX_GETTID_H +#define LINUX_GETTID_H + +long sys_gettid(int* uid, int* gid); + +#endif + diff --git a/src/kernel/emulation/linux/unistd/getuid.c b/src/kernel/emulation/linux/unistd/getuid.c index 088ec67e9..311c6de82 100644 --- a/src/kernel/emulation/linux/unistd/getuid.c +++ b/src/kernel/emulation/linux/unistd/getuid.c @@ -6,6 +6,8 @@ long sys_getuid(void) { - return lkm_call(NR_getuid, NULL); + struct uidgid ug; + lkm_call(NR_getuidgid, &ug); + return ug.uid; } diff --git a/src/kernel/emulation/linux/unistd/setegid.c b/src/kernel/emulation/linux/unistd/setegid.c index 13af14dbc..4a3b3685a 100644 --- a/src/kernel/emulation/linux/unistd/setegid.c +++ b/src/kernel/emulation/linux/unistd/setegid.c @@ -5,6 +5,11 @@ long sys_setegid(int egid) { - return lkm_call(NR_setgid, (void*)(long)egid); + struct uidgid ug = { + .uid = -1, + .gid = egid + }; + + return lkm_call(NR_setuidgid, &ug); } diff --git a/src/kernel/emulation/linux/unistd/seteuid.c b/src/kernel/emulation/linux/unistd/seteuid.c index 2ea325e5e..ad1e86f63 100644 --- a/src/kernel/emulation/linux/unistd/seteuid.c +++ b/src/kernel/emulation/linux/unistd/seteuid.c @@ -5,6 +5,11 @@ long sys_seteuid(int euid) { - return lkm_call(NR_setuid, (void*)(long)euid); + struct uidgid ug = { + .uid = euid, + .gid = -1 + }; + + return lkm_call(NR_setuidgid, &ug); } diff --git a/src/kernel/emulation/linux/unistd/setgid.c b/src/kernel/emulation/linux/unistd/setgid.c index 1dd638c84..089cef535 100644 --- a/src/kernel/emulation/linux/unistd/setgid.c +++ b/src/kernel/emulation/linux/unistd/setgid.c @@ -5,6 +5,11 @@ long sys_setgid(int gid) { - return lkm_call(NR_setgid, (void*)(long)gid); + struct uidgid ug = { + .uid = -1, + .gid = gid + }; + + return lkm_call(NR_setuidgid, &ug); } diff --git a/src/kernel/emulation/linux/unistd/settid.c b/src/kernel/emulation/linux/unistd/settid.c new file mode 100644 index 000000000..f0f4e46f8 --- /dev/null +++ b/src/kernel/emulation/linux/unistd/settid.c @@ -0,0 +1,15 @@ +#include "settid.h" +#include "../base.h" +#include "../mach/lkm.h" +#include "../../../../lkm/api.h" + +long sys_settid(int uid, int gid) +{ + struct uidgid ug = { + .uid = uid, + .gid = gid + }; + + return lkm_call(NR_setuidgid, &ug); +} + diff --git a/src/kernel/emulation/linux/unistd/settid.h b/src/kernel/emulation/linux/unistd/settid.h new file mode 100644 index 000000000..a1ef7f24c --- /dev/null +++ b/src/kernel/emulation/linux/unistd/settid.h @@ -0,0 +1,7 @@ +#ifndef LINUX_SETTID_H +#define LINUX_SETTID_H + +long sys_settid(int uid, int gid); + +#endif + diff --git a/src/kernel/emulation/linux/unistd/setuid.c b/src/kernel/emulation/linux/unistd/setuid.c index eec503a04..b13d61a1b 100644 --- a/src/kernel/emulation/linux/unistd/setuid.c +++ b/src/kernel/emulation/linux/unistd/setuid.c @@ -5,6 +5,11 @@ long sys_setuid(int uid) { - return lkm_call(NR_setuid, (void*)(long)uid); + struct uidgid ug = { + .uid = uid, + .gid = -1 + }; + + return lkm_call(NR_setuidgid, &ug); } diff --git a/src/lkm b/src/lkm index 49aa82521..c4e5f7924 160000 --- a/src/lkm +++ b/src/lkm @@ -1 +1 @@ -Subproject commit 49aa82521643b3ceb8001c55c561f78e59379f08 +Subproject commit c4e5f79247ce3e125485466902f98ae1775b7edc