diff options
-rw-r--r-- | sys/compat/svr4/svr4_misc.c | 37 | ||||
-rw-r--r-- | sys/compat/svr4/syscalls.master | 4 |
2 files changed, 38 insertions, 3 deletions
diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c index 1f34a282438..c9d7155fb26 100644 --- a/sys/compat/svr4/svr4_misc.c +++ b/sys/compat/svr4/svr4_misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: svr4_misc.c,v 1.17 1997/11/14 21:22:52 deraadt Exp $ */ +/* $OpenBSD: svr4_misc.c,v 1.18 1997/12/02 00:07:04 deraadt Exp $ */ /* $NetBSD: svr4_misc.c,v 1.42 1996/12/06 03:22:34 christos Exp $ */ /* @@ -48,6 +48,7 @@ #include <sys/kernel.h> #include <sys/malloc.h> #include <sys/mbuf.h> +#include <sys/ktrace.h> #include <sys/mman.h> #include <sys/mount.h> #include <sys/resource.h> @@ -1338,3 +1339,37 @@ svr4_sys_nice(p, v, retval) return 0; } + +/* ARGSUSED */ +int +svr4_sys_setegid(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + struct sys_setegid_args /* { + syscallarg(gid_t) egid; + } */ *uap = v; + +#if defined(COMPAT_LINUX) && defined(i386) + if (SCARG(uap, egid) > 60000) { + /* + * One great fuckup deserves another. The Linux people + * made this their personality system call. But we can't + * tell if a binary is SVR4 or Linux until they do that + * system call, in some cases. So when we get it, and the + * value is out of some magical range, switch to Linux + * emulation and pray. + */ + extern struct emul emul_linux_elf; + + p->p_emul = &emul_linux_elf; +#ifdef KTRACE + if (KTRPOINT(p, KTR_EMUL)) + ktremul(p->p_tracep, p->p_emul->e_name); +#endif + return (0); + } +#endif + return sys_setegid(p, v, retval); +} diff --git a/sys/compat/svr4/syscalls.master b/sys/compat/svr4/syscalls.master index 87aaea71445..d30b50c4513 100644 --- a/sys/compat/svr4/syscalls.master +++ b/sys/compat/svr4/syscalls.master @@ -1,4 +1,4 @@ - $OpenBSD: syscalls.master,v 1.19 1997/11/13 06:23:06 deraadt Exp $ + $OpenBSD: syscalls.master,v 1.20 1997/12/02 00:07:05 deraadt Exp $ ; $NetBSD: syscalls.master,v 1.17 1996/02/10 17:12:51 christos Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -234,7 +234,7 @@ 134 NOARGS { int sys_rename(char *from, char *to); } 135 STD { int svr4_sys_uname(struct svr4_utsname* name, \ int dummy); } -136 NOARGS { int sys_setegid(gid_t egid); } +136 STD { int svr4_sys_setegid(gid_t egid); } 137 STD { int svr4_sys_sysconfig(int name); } 138 NOARGS { int sys_adjtime(struct timeval *delta, \ struct timeval *olddelta); } |