diff options
-rw-r--r-- | sys/kern/init_sysent.c | 8 | ||||
-rw-r--r-- | sys/kern/kern_prot.c | 158 | ||||
-rw-r--r-- | sys/kern/syscalls.c | 8 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 6 | ||||
-rw-r--r-- | sys/sys/syscall-hide.h | 6 | ||||
-rw-r--r-- | sys/sys/syscall.h | 8 | ||||
-rw-r--r-- | sys/sys/syscall.mk | 8 | ||||
-rw-r--r-- | sys/sys/sysproto.h | 26 |
8 files changed, 214 insertions, 14 deletions
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index b0b528ce740b..89eb179f5e35 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp */ #include "opt_compat.h" @@ -331,8 +331,8 @@ struct sysent sysent[] = { { 2, (sy_call_t *)kldstat }, /* 308 = kldstat */ { 1, (sy_call_t *)kldfirstmod }, /* 309 = kldfirstmod */ { 1, (sy_call_t *)getsid }, /* 310 = getsid */ - { 0, (sy_call_t *)nosys }, /* 311 = setresuid */ - { 0, (sy_call_t *)nosys }, /* 312 = setresgid */ + { 3, (sy_call_t *)setresuid }, /* 311 = setresuid */ + { 3, (sy_call_t *)setresgid }, /* 312 = setresgid */ { 0, (sy_call_t *)nosys }, /* 313 = obsolete signanosleep */ { 1, (sy_call_t *)aio_return }, /* 314 = aio_return */ { 3, (sy_call_t *)aio_suspend }, /* 315 = aio_suspend */ @@ -380,4 +380,6 @@ struct sysent sysent[] = { { 4, (sy_call_t *)extattr_get_file }, /* 357 = extattr_get_file */ { 2, (sy_call_t *)extattr_delete_file }, /* 358 = extattr_delete_file */ { 2, (sy_call_t *)aio_waitcomplete }, /* 359 = aio_waitcomplete */ + { 3, (sy_call_t *)getresuid }, /* 360 = getresuid */ + { 3, (sy_call_t *)getresgid }, /* 361 = getresgid */ }; diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index e2a4f44bf44a..2ac10da6aca8 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -716,6 +716,164 @@ setregid(p, uap) return (0); } +/* + * setresuid(ruid, euid, suid) is like setreuid except control over the + * saved uid is explicit. + */ + +#ifndef _SYS_SYSPROTO_H_ +struct setresuid_args { + uid_t ruid; + uid_t euid; + uid_t suid; +}; +#endif +/* ARGSUSED */ +int +setresuid(p, uap) + register struct proc *p; + struct setresuid_args *uap; +{ + register struct pcred *pc = p->p_cred; + register uid_t ruid, euid, suid; + int error; + + ruid = uap->ruid; + euid = uap->euid; + suid = uap->suid; + if (((ruid != (uid_t)-1 && ruid != pc->p_ruid && ruid != pc->p_svuid && + ruid != pc->pc_ucred->cr_uid) || + (euid != (uid_t)-1 && euid != pc->p_ruid && euid != pc->p_svuid && + euid != pc->pc_ucred->cr_uid) || + (suid != (uid_t)-1 && suid != pc->p_ruid && suid != pc->p_svuid && + suid != pc->pc_ucred->cr_uid)) && + (error = suser_xxx(0, p, PRISON_ROOT)) != 0) + return (error); + if (euid != (uid_t)-1 && pc->pc_ucred->cr_uid != euid) { + pc->pc_ucred = crcopy(pc->pc_ucred); + pc->pc_ucred->cr_uid = euid; + setsugid(p); + } + if (ruid != (uid_t)-1 && pc->p_ruid != ruid) { + (void)chgproccnt(pc->p_ruid, -1); + (void)chgproccnt(ruid, 1); + pc->p_ruid = ruid; + setsugid(p); + } + if (suid != (uid_t)-1 && pc->p_svuid != suid) { + pc->p_svuid = suid; + setsugid(p); + } + return (0); +} + +/* + * setresgid(rgid, egid, sgid) is like setregid except control over the + * saved gid is explicit. + */ + +#ifndef _SYS_SYSPROTO_H_ +struct setresgid_args { + gid_t rgid; + gid_t egid; + gid_t sgid; +}; +#endif +/* ARGSUSED */ +int +setresgid(p, uap) + register struct proc *p; + struct setresgid_args *uap; +{ + register struct pcred *pc = p->p_cred; + register gid_t rgid, egid, sgid; + int error; + + rgid = uap->rgid; + egid = uap->egid; + sgid = uap->sgid; + if (((rgid != (gid_t)-1 && rgid != pc->p_rgid && rgid != pc->p_svgid && + rgid != pc->pc_ucred->cr_groups[0]) || + (egid != (gid_t)-1 && egid != pc->p_rgid && egid != pc->p_svgid && + egid != pc->pc_ucred->cr_groups[0]) || + (sgid != (gid_t)-1 && sgid != pc->p_rgid && sgid != pc->p_svgid && + sgid != pc->pc_ucred->cr_groups[0])) && + (error = suser_xxx(0, p, PRISON_ROOT)) != 0) + return (error); + + if (egid != (gid_t)-1 && pc->pc_ucred->cr_groups[0] != egid) { + pc->pc_ucred = crcopy(pc->pc_ucred); + pc->pc_ucred->cr_groups[0] = egid; + setsugid(p); + } + if (rgid != (gid_t)-1 && pc->p_rgid != rgid) { + pc->p_rgid = rgid; + setsugid(p); + } + if (sgid != (gid_t)-1 && pc->p_svgid != sgid) { + pc->p_svgid = sgid; + setsugid(p); + } + return (0); +} + +#ifndef _SYS_SYSPROTO_H_ +struct getresuid_args { + uid_t *ruid; + uid_t *euid; + uid_t *suid; +}; +#endif +/* ARGSUSED */ +int +getresuid(p, uap) + register struct proc *p; + struct getresuid_args *uap; +{ + struct pcred *pc = p->p_cred; + int error1 = 0, error2 = 0, error3 = 0; + + if (uap->ruid) + error1 = copyout((caddr_t)&pc->p_ruid, + (caddr_t)uap->ruid, sizeof(pc->p_ruid)); + if (uap->euid) + error2 = copyout((caddr_t)&pc->pc_ucred->cr_uid, + (caddr_t)uap->euid, sizeof(pc->pc_ucred->cr_uid)); + if (uap->suid) + error3 = copyout((caddr_t)&pc->p_svuid, + (caddr_t)uap->suid, sizeof(pc->p_svuid)); + return error1 ? error1 : (error2 ? error2 : error3); +} + +#ifndef _SYS_SYSPROTO_H_ +struct getresgid_args { + gid_t *rgid; + gid_t *egid; + gid_t *sgid; +}; +#endif +/* ARGSUSED */ +int +getresgid(p, uap) + register struct proc *p; + struct getresgid_args *uap; +{ + struct pcred *pc = p->p_cred; + int error1 = 0, error2 = 0, error3 = 0; + + if (uap->rgid) + error1 = copyout((caddr_t)&pc->p_rgid, + (caddr_t)uap->rgid, sizeof(pc->p_rgid)); + if (uap->egid) + error2 = copyout((caddr_t)&pc->pc_ucred->cr_groups[0], + (caddr_t)uap->egid, sizeof(pc->pc_ucred->cr_groups[0])); + if (uap->sgid) + error3 = copyout((caddr_t)&pc->p_svgid, + (caddr_t)uap->sgid, sizeof(pc->p_svgid)); + return error1 ? error1 : (error2 ? error2 : error3); +} + + #ifndef _SYS_SYSPROTO_H_ struct issetugid_args { int dummy; diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 8a8197a3f45e..0f3fa4c493cf 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp */ char *syscallnames[] = { @@ -318,8 +318,8 @@ char *syscallnames[] = { "kldstat", /* 308 = kldstat */ "kldfirstmod", /* 309 = kldfirstmod */ "getsid", /* 310 = getsid */ - "#311", /* 311 = setresuid */ - "#312", /* 312 = setresgid */ + "setresuid", /* 311 = setresuid */ + "setresgid", /* 312 = setresgid */ "obs_signanosleep", /* 313 = obsolete signanosleep */ "aio_return", /* 314 = aio_return */ "aio_suspend", /* 315 = aio_suspend */ @@ -367,4 +367,6 @@ char *syscallnames[] = { "extattr_get_file", /* 357 = extattr_get_file */ "extattr_delete_file", /* 358 = extattr_delete_file */ "aio_waitcomplete", /* 359 = aio_waitcomplete */ + "getresuid", /* 360 = getresuid */ + "getresgid", /* 361 = getresgid */ }; diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index df23a4d1a95d..6ca47cf239fc 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -443,8 +443,8 @@ 308 STD BSD { int kldstat(int fileid, struct kld_file_stat* stat); } 309 STD BSD { int kldfirstmod(int fileid); } 310 STD BSD { int getsid(pid_t pid); } -311 UNIMPL NOHIDE setresuid -312 UNIMPL NOHIDE setresgid +311 STD BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } +312 STD BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } 313 OBSOL NOHIDE signanosleep 314 STD BSD { int aio_return(struct aiocb *aiocbp); } 315 STD BSD { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } @@ -498,3 +498,5 @@ 357 STD BSD { int extattr_get_file(char *path, char *attrname, struct iovec *iovp, u_int iovcnt); } 358 STD BSD { int extattr_delete_file(char *path, char *attrname); } 359 STD BSD { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } +360 STD BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } +361 STD BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } diff --git a/sys/sys/syscall-hide.h b/sys/sys/syscall-hide.h index c08c93754603..1732da7ac8c7 100644 --- a/sys/sys/syscall-hide.h +++ b/sys/sys/syscall-hide.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp */ HIDE_POSIX(fork) @@ -231,6 +231,8 @@ HIDE_BSD(kldnext) HIDE_BSD(kldstat) HIDE_BSD(kldfirstmod) HIDE_BSD(getsid) +HIDE_BSD(setresuid) +HIDE_BSD(setresgid) HIDE_BSD(aio_return) HIDE_BSD(aio_suspend) HIDE_BSD(aio_cancel) @@ -275,3 +277,5 @@ HIDE_BSD(extattr_set_file) HIDE_BSD(extattr_get_file) HIDE_BSD(extattr_delete_file) HIDE_BSD(aio_waitcomplete) +HIDE_BSD(getresuid) +HIDE_BSD(getresgid) diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index c3dcd0cbfa4c..eee91cb05b1e 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp */ #define SYS_syscall 0 @@ -236,6 +236,8 @@ #define SYS_kldstat 308 #define SYS_kldfirstmod 309 #define SYS_getsid 310 +#define SYS_setresuid 311 +#define SYS_setresgid 312 /* 313 is obsolete signanosleep */ #define SYS_aio_return 314 #define SYS_aio_suspend 315 @@ -280,4 +282,6 @@ #define SYS_extattr_get_file 357 #define SYS_extattr_delete_file 358 #define SYS_aio_waitcomplete 359 -#define SYS_MAXSYSCALL 360 +#define SYS_getresuid 360 +#define SYS_getresgid 361 +#define SYS_MAXSYSCALL 362 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index ee2737eafd9f..d3e0be35c59d 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. # $FreeBSD$ -# created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp +# created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp MIASM = \ syscall.o \ exit.o \ @@ -188,6 +188,8 @@ MIASM = \ kldstat.o \ kldfirstmod.o \ getsid.o \ + setresuid.o \ + setresgid.o \ aio_return.o \ aio_suspend.o \ aio_cancel.o \ @@ -230,4 +232,6 @@ MIASM = \ extattr_set_file.o \ extattr_get_file.o \ extattr_delete_file.o \ - aio_waitcomplete.o + aio_waitcomplete.o \ + getresuid.o \ + getresgid.o diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 14bb02f3b11c..4de03ca9c7c3 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp */ #ifndef _SYS_SYSPROTO_H_ @@ -814,6 +814,16 @@ struct kldfirstmod_args { struct getsid_args { pid_t pid; char pid_[PAD_(pid_t)]; }; +struct setresuid_args { + uid_t ruid; char ruid_[PAD_(uid_t)]; + uid_t euid; char euid_[PAD_(uid_t)]; + uid_t suid; char suid_[PAD_(uid_t)]; +}; +struct setresgid_args { + gid_t rgid; char rgid_[PAD_(gid_t)]; + gid_t egid; char egid_[PAD_(gid_t)]; + gid_t sgid; char sgid_[PAD_(gid_t)]; +}; struct aio_return_args { struct aiocb * aiocbp; char aiocbp_[PAD_(struct aiocb *)]; }; @@ -993,6 +1003,16 @@ struct aio_waitcomplete_args { struct aiocb ** aiocbp; char aiocbp_[PAD_(struct aiocb **)]; struct timespec * timeout; char timeout_[PAD_(struct timespec *)]; }; +struct getresuid_args { + uid_t * ruid; char ruid_[PAD_(uid_t *)]; + uid_t * euid; char euid_[PAD_(uid_t *)]; + uid_t * suid; char suid_[PAD_(uid_t *)]; +}; +struct getresgid_args { + gid_t * rgid; char rgid_[PAD_(gid_t *)]; + gid_t * egid; char egid_[PAD_(gid_t *)]; + gid_t * sgid; char sgid_[PAD_(gid_t *)]; +}; int nosys __P((struct proc *, struct nosys_args *)); void exit __P((struct proc *, struct rexit_args *)) __dead2; int fork __P((struct proc *, struct fork_args *)); @@ -1176,6 +1196,8 @@ int kldnext __P((struct proc *, struct kldnext_args *)); int kldstat __P((struct proc *, struct kldstat_args *)); int kldfirstmod __P((struct proc *, struct kldfirstmod_args *)); int getsid __P((struct proc *, struct getsid_args *)); +int setresuid __P((struct proc *, struct setresuid_args *)); +int setresgid __P((struct proc *, struct setresgid_args *)); int aio_return __P((struct proc *, struct aio_return_args *)); int aio_suspend __P((struct proc *, struct aio_suspend_args *)); int aio_cancel __P((struct proc *, struct aio_cancel_args *)); @@ -1219,6 +1241,8 @@ int extattr_set_file __P((struct proc *, struct extattr_set_file_args *)); int extattr_get_file __P((struct proc *, struct extattr_get_file_args *)); int extattr_delete_file __P((struct proc *, struct extattr_delete_file_args *)); int aio_waitcomplete __P((struct proc *, struct aio_waitcomplete_args *)); +int getresuid __P((struct proc *, struct getresuid_args *)); +int getresgid __P((struct proc *, struct getresgid_args *)); #ifdef COMPAT_43 |