diff --git a/kernel/include/thread/Task.h b/kernel/include/thread/Task.h index 797daf90..2882df94 100644 --- a/kernel/include/thread/Task.h +++ b/kernel/include/thread/Task.h @@ -36,6 +36,11 @@ struct Task int64_t task_time = 0; + int uid; + int euid; + int gid; + int egid; + Task* next_task = nullptr; Task* prev_task = nullptr; @@ -98,6 +103,8 @@ struct Task Descriptor* descriptor_from_fd(int fd, int& error); + bool is_superuser(); + private: void resume_read(); void resume_wait(); diff --git a/kernel/src/sys/exec.cpp b/kernel/src/sys/exec.cpp index 3045c7ce..c5a3bfbc 100644 --- a/kernel/src/sys/exec.cpp +++ b/kernel/src/sys/exec.cpp @@ -45,6 +45,11 @@ void sys_fork(Context* context) child->ppid = parent->id; + child->uid = parent->uid; + child->euid = parent->euid; + child->gid = parent->gid; + child->egid = parent->egid; + child->regs.rax = 0; context->rax = child->id; diff --git a/kernel/src/sys/id.cpp b/kernel/src/sys/id.cpp index 2e097118..018a7027 100644 --- a/kernel/src/sys/id.cpp +++ b/kernel/src/sys/id.cpp @@ -3,6 +3,10 @@ #define ID_PID 0 #define ID_PPID 1 +#define ID_UID 2 +#define ID_EUID 3 +#define ID_GID 4 +#define ID_EGID 5 void sys_getprocid(Context* context, int field) { @@ -16,6 +20,26 @@ void sys_getprocid(Context* context, int field) context->rax = Scheduler::current_task()->ppid; return; } + else if (field == ID_UID) + { + context->rax = Scheduler::current_task()->uid; + return; + } + else if (field == ID_EUID) + { + context->rax = Scheduler::current_task()->euid; + return; + } + else if (field == ID_GID) + { + context->rax = Scheduler::current_task()->gid; + return; + } + else if (field == ID_EGID) + { + context->rax = Scheduler::current_task()->egid; + return; + } else { context->rax = -EINVAL; diff --git a/kernel/src/thread/Task.cpp b/kernel/src/thread/Task.cpp index 8d2fb115..c01ec34b 100644 --- a/kernel/src/thread/Task.cpp +++ b/kernel/src/thread/Task.cpp @@ -125,4 +125,9 @@ Descriptor* Task::descriptor_from_fd(int fd, int& error) return nullptr; } return &files[fd]; +} + +bool Task::is_superuser() +{ + return euid == 0; } \ No newline at end of file diff --git a/libs/libc/include/bits/getprocid.h b/libs/libc/include/bits/getprocid.h index 0336f904..aa0396a4 100644 --- a/libs/libc/include/bits/getprocid.h +++ b/libs/libc/include/bits/getprocid.h @@ -3,5 +3,9 @@ #define ID_PID 0 #define ID_PPID 1 +#define ID_UID 2 +#define ID_EUID 3 +#define ID_GID 4 +#define ID_EGID 5 #endif \ No newline at end of file