summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/init_sysent.c8
-rw-r--r--sys/kern/kern_prot.c158
-rw-r--r--sys/kern/syscalls.c8
-rw-r--r--sys/kern/syscalls.master6
-rw-r--r--sys/sys/syscall-hide.h6
-rw-r--r--sys/sys/syscall.h8
-rw-r--r--sys/sys/syscall.mk8
-rw-r--r--sys/sys/sysproto.h26
8 files changed, 214 insertions, 14 deletions
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index b0b528c..89eb179 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 e2a4f44..2ac10da 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 8a8197a..0f3fa4c 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 df23a4d..6ca47cf 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 c08c937..1732da7 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 c3dcd0c..eee91cb 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 ee2737e..d3e0be3 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 14bb02f..4de03ca 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
OpenPOWER on IntegriCloud