mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 03:57:44 +00:00
Kernel+Userland: Implement setuid() and setgid() and add /bin/su
Also show setuid and setgid bits in "ls -l" output. :^)
This commit is contained in:
parent
6071a77e8e
commit
920e8e58ed
9 changed files with 79 additions and 8 deletions
|
@ -411,6 +411,11 @@ int Process::do_exec(String path, Vector<String> arguments, Vector<String> envir
|
|||
m_initial_arguments = move(arguments);
|
||||
m_initial_environment = move(environment);
|
||||
|
||||
if (descriptor->metadata().is_setuid())
|
||||
m_euid = descriptor->metadata().uid;
|
||||
if (descriptor->metadata().is_setgid())
|
||||
m_egid = descriptor->metadata().gid;
|
||||
|
||||
#ifdef TASK_DEBUG
|
||||
kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), m_tss.eip);
|
||||
#endif
|
||||
|
@ -1352,14 +1357,22 @@ int Process::sys$killpg(int pgrp, int signum)
|
|||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int Process::sys$setuid(uid_t)
|
||||
int Process::sys$setuid(uid_t uid)
|
||||
{
|
||||
ASSERT_NOT_REACHED();
|
||||
if (uid != m_uid && !is_superuser())
|
||||
return -EPERM;
|
||||
m_uid = uid;
|
||||
m_euid = uid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Process::sys$setgid(gid_t)
|
||||
int Process::sys$setgid(gid_t gid)
|
||||
{
|
||||
ASSERT_NOT_REACHED();
|
||||
if (gid != m_gid && !is_superuser())
|
||||
return -EPERM;
|
||||
m_gid = gid;
|
||||
m_egid = gid;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned Process::sys$alarm(unsigned seconds)
|
||||
|
@ -1900,7 +1913,7 @@ int Process::sys$getgroups(int count, gid_t* gids)
|
|||
|
||||
int Process::sys$setgroups(size_t count, const gid_t* gids)
|
||||
{
|
||||
if (!is_root())
|
||||
if (!is_superuser())
|
||||
return -EPERM;
|
||||
if (count >= MAX_PROCESS_GIDS)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -283,7 +283,7 @@ public:
|
|||
Process* fork(RegisterDump&);
|
||||
int exec(String path, Vector<String> arguments, Vector<String> environment);
|
||||
|
||||
bool is_root() const { return m_euid == 0; }
|
||||
bool is_superuser() const { return m_euid == 0; }
|
||||
|
||||
bool wakeup_requested() { return m_wakeup_requested; }
|
||||
void request_wakeup() { m_wakeup_requested = true; }
|
||||
|
|
|
@ -32,7 +32,10 @@ ln -s /proc/self/fd/0 mnt/dev/stdin
|
|||
ln -s /proc/self/fd/1 mnt/dev/stdout
|
||||
ln -s /proc/self/fd/2 mnt/dev/stderr
|
||||
cp -vR ../Base/* mnt/
|
||||
mkdir mnt/home/anon
|
||||
mkdir mnt/home/nona
|
||||
chown -vR 100:100 mnt/home/anon
|
||||
chown -vR 200:200 mnt/home/nona
|
||||
cp -v ../Userland/sh mnt/bin/sh
|
||||
cp -v ../Userland/id mnt/bin/id
|
||||
cp -v ../Userland/ps mnt/bin/ps
|
||||
|
@ -65,6 +68,8 @@ cp -v ../Userland/chmod mnt/bin/chmod
|
|||
cp -v ../Userland/top mnt/bin/top
|
||||
cp -v ../Userland/ln mnt/bin/ln
|
||||
cp -v ../Userland/df mnt/bin/df
|
||||
cp -v ../Userland/su mnt/bin/su
|
||||
chmod 4755 mnt/bin/su
|
||||
cp -v ../Applications/Terminal/Terminal mnt/bin/Terminal
|
||||
cp -v ../Applications/FontEditor/FontEditor mnt/bin/FontEditor
|
||||
cp -v ../Applications/Launcher/Launcher mnt/bin/Launcher
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue