mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
execve: SUID and SGID
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <kernel/cred.h>
|
||||
#include <errno.h>
|
||||
#include <logging.h>
|
||||
|
||||
int cred_setuids(cred_t *cred, int uid, int euid, int suid) {
|
||||
if (uid < -1 || euid < -1 || suid < -1 || (uid == -1 && euid == -1 && suid == -1))
|
||||
@@ -27,6 +28,17 @@ int cred_setgids(cred_t *cred, int gid, int egid, int sgid) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cred_doexec(cred_t *cred, int suid, int sgid) {
|
||||
if (suid > -1)
|
||||
cred->euid = suid;
|
||||
|
||||
if (sgid > -1)
|
||||
cred->egid = sgid;
|
||||
|
||||
cred->suid = cred->euid;
|
||||
cred->sgid = cred->egid;
|
||||
}
|
||||
|
||||
void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp) {
|
||||
*uidp = cred->uid;
|
||||
*euidp = cred->euid;
|
||||
|
||||
@@ -262,6 +262,11 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
||||
goto error;
|
||||
}
|
||||
|
||||
vattr_t vattr;
|
||||
ret.errno = VOP_GETATTR(node, &vattr, NULL);
|
||||
if (ret.errno)
|
||||
goto error;
|
||||
|
||||
ret.ret = 0;
|
||||
|
||||
sched_stopotherthreads();
|
||||
@@ -281,6 +286,17 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
||||
CTX_SP(context) = (uint64_t)stack;
|
||||
CTX_IP(context) = (uint64_t)entry;
|
||||
|
||||
int suid = -1;
|
||||
int sgid = -1;
|
||||
|
||||
if (vattr.mode & V_ATTR_MODE_SUID)
|
||||
suid = vattr.uid;
|
||||
|
||||
if (vattr.mode & V_ATTR_MODE_SGID)
|
||||
sgid = vattr.gid;
|
||||
|
||||
cred_doexec(&_cpu()->thread->proc->cred, suid, sgid);
|
||||
|
||||
error:
|
||||
free(path);
|
||||
if (argv)
|
||||
|
||||
Reference in New Issue
Block a user