seteuid() and setegid()

This commit is contained in:
Ben Gras 2005-12-13 09:48:29 +00:00
parent f18384d54c
commit f6e5052597
10 changed files with 41 additions and 6 deletions

View file

@ -40,9 +40,6 @@
#define v12_super_block super_block #define v12_super_block super_block
#define SUPER_V1 SUPER_MAGIC #define SUPER_V1 SUPER_MAGIC
/* Only setuid() and setgid(). */
#define seteuid(uid) setuid(uid)
#define setegid(gid) setgid(gid)
#endif #endif
#define ISDISK(mode) S_ISBLK(mode) /* || S_ISCHR for raw device??? */ #define ISDISK(mode) S_ISBLK(mode) /* || S_ISCHR for raw device??? */

View file

@ -1,4 +1,4 @@
#define NCALLS 91 /* number of system calls allowed */ #define NCALLS 93 /* number of system calls allowed */
#define EXIT 1 #define EXIT 1
#define FORK 2 #define FORK 2
@ -82,3 +82,5 @@
#define GETPRIORITY 88 /* to PM */ #define GETPRIORITY 88 /* to PM */
#define SETPRIORITY 89 /* to PM */ #define SETPRIORITY 89 /* to PM */
#define GETTIMEOFDAY 90 /* to PM */ #define GETTIMEOFDAY 90 /* to PM */
#define SETEUID 91 /* to PM (and PM -> FS) */
#define SETEGID 92 /* to PM (and PM -> FS) */

View file

@ -124,9 +124,11 @@ _PROTOTYPE( int pipe, (int _fildes[2]) );
_PROTOTYPE( ssize_t read, (int _fd, void *_buf, size_t _n) ); _PROTOTYPE( ssize_t read, (int _fd, void *_buf, size_t _n) );
_PROTOTYPE( int rmdir, (const char *_path) ); _PROTOTYPE( int rmdir, (const char *_path) );
_PROTOTYPE( int setgid, (_mnx_Gid_t _gid) ); _PROTOTYPE( int setgid, (_mnx_Gid_t _gid) );
_PROTOTYPE( int setegid, (_mnx_Gid_t _gid) );
_PROTOTYPE( int setpgid, (pid_t _pid, pid_t _pgid) ); _PROTOTYPE( int setpgid, (pid_t _pid, pid_t _pgid) );
_PROTOTYPE( pid_t setsid, (void) ); _PROTOTYPE( pid_t setsid, (void) );
_PROTOTYPE( int setuid, (_mnx_Uid_t _uid) ); _PROTOTYPE( int setuid, (_mnx_Uid_t _uid) );
_PROTOTYPE( int seteuid, (_mnx_Uid_t _uid) );
_PROTOTYPE( unsigned int sleep, (unsigned int _seconds) ); _PROTOTYPE( unsigned int sleep, (unsigned int _seconds) );
_PROTOTYPE( long sysconf, (int _name) ); _PROTOTYPE( long sysconf, (int _name) );
_PROTOTYPE( pid_t tcgetpgrp, (int _fd) ); _PROTOTYPE( pid_t tcgetpgrp, (int _fd) );

View file

@ -1,5 +1,6 @@
#include <lib.h> #include <lib.h>
#define setgid _setgid #define setgid _setgid
#define setegid _setegid
#include <unistd.h> #include <unistd.h>
PUBLIC int setgid(grp) PUBLIC int setgid(grp)
@ -10,3 +11,12 @@ gid_t grp;
m.m1_i1 = (int) grp; m.m1_i1 = (int) grp;
return(_syscall(MM, SETGID, &m)); return(_syscall(MM, SETGID, &m));
} }
PUBLIC int setegid(grp)
gid_t grp;
{
message m;
m.m1_i1 = (int) grp;
return(_syscall(MM, SETEGID, &m));
}

View file

@ -1,5 +1,6 @@
#include <lib.h> #include <lib.h>
#define setuid _setuid #define setuid _setuid
#define seteuid _seteuid
#include <unistd.h> #include <unistd.h>
PUBLIC int setuid(usr) PUBLIC int setuid(usr)
@ -10,3 +11,12 @@ _mnx_Uid_t usr;
m.m1_i1 = usr; m.m1_i1 = usr;
return(_syscall(MM, SETUID, &m)); return(_syscall(MM, SETUID, &m));
} }
PUBLIC int seteuid(usr)
_mnx_Uid_t usr;
{
message m;
m.m1_i1 = usr;
return(_syscall(MM, SETEUID, &m));
}

View file

@ -1,7 +1,11 @@
.sect .text .sect .text
.extern __setgid .extern __setgid
.define _setgid .define _setgid
.define _setegid
.align 2 .align 2
_setgid: _setgid:
jmp __setgid jmp __setgid
_setegid:
jmp __setegid

View file

@ -1,7 +1,11 @@
.sect .text .sect .text
.extern __setuid .extern __setuid
.define _setuid .define _setuid
.define _seteuid
.align 2 .align 2
_setuid: _setuid:
jmp __setuid jmp __setuid
_seteuid:
jmp __seteuid

View file

@ -108,6 +108,8 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = {
no_sys, /* 88 = getpriority */ no_sys, /* 88 = getpriority */
no_sys, /* 89 = setpriority */ no_sys, /* 89 = setpriority */
no_sys, /* 90 = gettimeofday */ no_sys, /* 90 = gettimeofday */
no_sys, /* 91 = seteuid */
no_sys, /* 92 = setegid */
}; };
/* This should not fail with "array size is negative": */ /* This should not fail with "array size is negative": */
extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1]; extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];

View file

@ -42,21 +42,23 @@ PUBLIC int do_getset()
rmp->mp_reply.reply_res3 = mproc[m_in.procnr].mp_pid; rmp->mp_reply.reply_res3 = mproc[m_in.procnr].mp_pid;
break; break;
case SETEUID:
case SETUID: case SETUID:
if (rmp->mp_realuid != (uid_t) m_in.usr_id && if (rmp->mp_realuid != (uid_t) m_in.usr_id &&
rmp->mp_effuid != SUPER_USER) rmp->mp_effuid != SUPER_USER)
return(EPERM); return(EPERM);
rmp->mp_realuid = (uid_t) m_in.usr_id; if(call_nr == SETUID) rmp->mp_realuid = (uid_t) m_in.usr_id;
rmp->mp_effuid = (uid_t) m_in.usr_id; rmp->mp_effuid = (uid_t) m_in.usr_id;
tell_fs(SETUID, who, rmp->mp_realuid, rmp->mp_effuid); tell_fs(SETUID, who, rmp->mp_realuid, rmp->mp_effuid);
r = OK; r = OK;
break; break;
case SETEGID:
case SETGID: case SETGID:
if (rmp->mp_realgid != (gid_t) m_in.grp_id && if (rmp->mp_realgid != (gid_t) m_in.grp_id &&
rmp->mp_effuid != SUPER_USER) rmp->mp_effuid != SUPER_USER)
return(EPERM); return(EPERM);
rmp->mp_realgid = (gid_t) m_in.grp_id; if(call_nr == SETGID) rmp->mp_realgid = (gid_t) m_in.grp_id;
rmp->mp_effgid = (gid_t) m_in.grp_id; rmp->mp_effgid = (gid_t) m_in.grp_id;
tell_fs(SETGID, who, rmp->mp_realgid, rmp->mp_effgid); tell_fs(SETGID, who, rmp->mp_realgid, rmp->mp_effgid);
r = OK; r = OK;

View file

@ -107,6 +107,8 @@ _PROTOTYPE (int (*call_vec[NCALLS]), (void) ) = {
do_getsetpriority, /* 88 = getpriority */ do_getsetpriority, /* 88 = getpriority */
do_getsetpriority, /* 89 = setpriority */ do_getsetpriority, /* 89 = setpriority */
do_time, /* 90 = gettimeofday */ do_time, /* 90 = gettimeofday */
do_getset, /* 91 = seteuid */
do_getset /* 92 = setegid */
}; };
/* This should not fail with "array size is negative": */ /* This should not fail with "array size is negative": */
extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1]; extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1];