mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 14:38:21 +00:00
execve: SUID and SGID
This commit is contained in:
@@ -17,5 +17,6 @@ int cred_setuids(cred_t *cred, int uid, int euid, int suid);
|
|||||||
int cred_setgids(cred_t *cred, int uid, int euid, int suid);
|
int cred_setgids(cred_t *cred, int uid, int euid, int suid);
|
||||||
void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp);
|
void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp);
|
||||||
void cred_getgids(cred_t *cred, int *gidp, int *egidp, int *sgidp);
|
void cred_getgids(cred_t *cred, int *gidp, int *egidp, int *sgidp);
|
||||||
|
void cred_doexec(cred_t *cred, int suid, int sgid);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include <kernel/cred.h>
|
#include <kernel/cred.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <logging.h>
|
||||||
|
|
||||||
int cred_setuids(cred_t *cred, int uid, int euid, int suid) {
|
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))
|
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;
|
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) {
|
void cred_getuids(cred_t *cred, int *uidp, int *euidp, int *suidp) {
|
||||||
*uidp = cred->uid;
|
*uidp = cred->uid;
|
||||||
*euidp = cred->euid;
|
*euidp = cred->euid;
|
||||||
|
|||||||
@@ -262,6 +262,11 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vattr_t vattr;
|
||||||
|
ret.errno = VOP_GETATTR(node, &vattr, NULL);
|
||||||
|
if (ret.errno)
|
||||||
|
goto error;
|
||||||
|
|
||||||
ret.ret = 0;
|
ret.ret = 0;
|
||||||
|
|
||||||
sched_stopotherthreads();
|
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_SP(context) = (uint64_t)stack;
|
||||||
CTX_IP(context) = (uint64_t)entry;
|
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:
|
error:
|
||||||
free(path);
|
free(path);
|
||||||
if (argv)
|
if (argv)
|
||||||
|
|||||||
Reference in New Issue
Block a user