summaryrefslogtreecommitdiff
path: root/sys/compat/linux
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2002-10-30 20:10:49 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2002-10-30 20:10:49 +0000
commit8f5206fef6e1f20fbd462a7a9b64ee338afbec7c (patch)
tree91706af7f0d189f67e01f31d99f5111000a11206 /sys/compat/linux
parentcc75464191402fc7408d43c0c4dcb28f42101089 (diff)
Now that we have [gs]etres[ug]id() as a native system call, use it
for HP-UX, FreeBSD, and Linux emulations. Note that Linux has two versions of these system calls. One for 16bit uids and another for 32bit uids.
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/linux_dummy.c5
-rw-r--r--sys/compat/linux/linux_misc.c229
-rw-r--r--sys/compat/linux/syscalls.master29
3 files changed, 75 insertions, 188 deletions
diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c
index ac06b9a0451..5883b487338 100644
--- a/sys/compat/linux/linux_dummy.c
+++ b/sys/compat/linux/linux_dummy.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: linux_dummy.c,v 1.9 2002/10/28 03:39:30 fgsch Exp $ */
+/* $OpenBSD: linux_dummy.c,v 1.10 2002/10/30 20:10:48 millert Exp $ */
/*-
* Copyright (c) 1994-1995 Søren Schmidt
@@ -113,9 +113,6 @@ DUMMY(lchown); /* #198 */
DUMMY(setreuid); /* #203 */
DUMMY(setregid); /* #204 */
DUMMY(fchown); /* #207 */
-DUMMY(setresuid); /* #208 */
-DUMMY(setresgid); /* #210 */
-DUMMY(getresgid); /* #211 */
DUMMY(chown); /* #212 */
DUMMY(setfsgid); /* #216 */
DUMMY(pivot_root); /* #217 */
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 58b4910cbd5..3fa69f6bf15 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: linux_misc.c,v 1.46 2002/10/28 03:39:30 fgsch Exp $ */
+/* $OpenBSD: linux_misc.c,v 1.47 2002/10/30 20:10:48 millert Exp $ */
/* $NetBSD: linux_misc.c,v 1.27 1996/05/20 01:59:21 fvdl Exp $ */
/*
@@ -217,96 +217,85 @@ linux_sys_setresgid16(p, v, retval)
register_t *retval;
{
struct linux_sys_setresgid16_args /* {
- syscallarg(gid_t) rgid;
- syscallarg(gid_t) egid;
- syscallarg(gid_t) sgid;
+ syscallarg(u_int16_t) rgid;
+ syscallarg(u_int16_t) egid;
+ syscallarg(u_int16_t) sgid;
} */ *uap = v;
- struct pcred *pc = p->p_cred;
- gid_t rgid, egid, sgid;
- int error;
+ struct sys_setresgid_args nuap;
+ u_int16_t rgid, egid, sgid;
rgid = SCARG(uap, rgid);
+ SCARG(&nuap, rgid) = (rgid == (u_int16_t)-1) ? (gid_t)-1 : rgid;
egid = SCARG(uap, egid);
+ SCARG(&nuap, egid) = (egid == (u_int16_t)-1) ? (gid_t)-1 : egid;
sgid = SCARG(uap, sgid);
+ SCARG(&nuap, sgid) = (sgid == (u_int16_t)-1) ? (gid_t)-1 : sgid;
- /*
- * Note: These checks are a little different than the OpenBSD
- * setregid(2) call performs. This precisely follows the
- * behavior of the Linux kernel.
- */
- if (rgid != (gid_t)-1 &&
- rgid != pc->p_rgid &&
- rgid != pc->pc_ucred->cr_gid &&
- rgid != pc->p_svgid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
- return (error);
+ return sys_setresgid(p, &nuap, retval);
+}
- if (egid != (gid_t)-1 &&
- egid != pc->p_rgid &&
- egid != pc->pc_ucred->cr_gid &&
- egid != pc->p_svgid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
- return (error);
+int
+linux_sys_getresgid16(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct linux_sys_getresgid16_args /* {
+ syscallarg(u_int16_t *) rgid;
+ syscallarg(u_int16_t *) egid;
+ syscallarg(u_int16_t *) sgid;
+ } */ *uap = v;
+ struct sys_getresgid_args nuap;
- if (sgid != (gid_t)-1 &&
- sgid != pc->p_rgid &&
- sgid != pc->pc_ucred->cr_gid &&
- sgid != pc->p_svgid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
- return (error);
+ SCARG(&nuap, rgid) = (gid_t *)SCARG(uap, rgid);
+ SCARG(&nuap, egid) = (gid_t *)SCARG(uap, egid);
+ SCARG(&nuap, sgid) = (gid_t *)SCARG(uap, sgid);
- /*
- * Now assign the real, effective, and saved GIDs.
- * Note that Linux, unlike OpenBSD in setregid(2), does not
- * set the saved UID in this call unless the user specifies
- * it.
- */
- if (rgid != (gid_t)-1)
- pc->p_rgid = rgid;
+ return sys_getresgid(p, &nuap, retval);
+}
- if (egid != (gid_t)-1) {
- pc->pc_ucred = crcopy(pc->pc_ucred);
- pc->pc_ucred->cr_gid = egid;
- }
+int
+linux_sys_setresuid16(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct linux_sys_setresuid16_args /* {
+ syscallarg(u_int16_t) ruid;
+ syscallarg(u_int16_t) euid;
+ syscallarg(u_int16_t) suid;
+ } */ *uap = v;
+ struct sys_setresuid_args nuap;
+ u_int16_t ruid, euid, suid;
- if (sgid != (gid_t)-1)
- pc->p_svgid = sgid;
+ ruid = SCARG(uap, ruid);
+ SCARG(&nuap, ruid) = (ruid == (u_int16_t)-1) ? (uid_t)-1 : ruid;
+ euid = SCARG(uap, euid);
+ SCARG(&nuap, euid) = (euid == (u_int16_t)-1) ? (uid_t)-1 : euid;
+ suid = SCARG(uap, suid);
+ SCARG(&nuap, suid) = (suid == (u_int16_t)-1) ? (uid_t)-1 : suid;
- if (rgid != (gid_t)-1 && egid != (gid_t)-1 && sgid != (gid_t)-1)
- p->p_flag |= P_SUGID;
- return (0);
+ return sys_setresuid(p, &nuap, retval);
}
int
-linux_sys_getresgid16(p, v, retval)
+linux_sys_getresuid16(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
- struct linux_sys_getresgid16_args /* {
- syscallarg(gid_t *) rgid;
- syscallarg(gid_t *) egid;
- syscallarg(gid_t *) sgid;
+ struct linux_sys_getresuid16_args /* {
+ syscallarg(u_int16_t *) ruid;
+ syscallarg(u_int16_t *) euid;
+ syscallarg(u_int16_t *) suid;
} */ *uap = v;
- struct pcred *pc = p->p_cred;
- int error;
-
- /*
- * Linux copies these values out to userspace like so:
- *
- * 1. Copy out rgid.
- * 2. If that succeeds, copy out egid.
- * 3. If both of those succeed, copy out sgid.
- */
- if ((error = copyout(&pc->p_rgid, SCARG(uap, rgid),
- sizeof(gid_t))) != 0)
- return (error);
+ struct sys_getresuid_args nuap;
- if ((error = copyout(&pc->pc_ucred->cr_uid, SCARG(uap, egid),
- sizeof(gid_t))) != 0)
- return (error);
+ SCARG(&nuap, ruid) = (uid_t *)SCARG(uap, ruid);
+ SCARG(&nuap, euid) = (uid_t *)SCARG(uap, euid);
+ SCARG(&nuap, suid) = (uid_t *)SCARG(uap, suid);
- return (copyout(&pc->p_svgid, SCARG(uap, sgid), sizeof(gid_t)));
+ return sys_getresuid(p, &nuap, retval);
}
/*
@@ -1344,108 +1333,6 @@ linux_sys___sysctl(p, v, retval)
return sys___sysctl(p, &bsa, retval);
}
-int
-linux_sys_setresuid16(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct linux_sys_setresuid16_args /* {
- syscallarg(uid_t) ruid;
- syscallarg(uid_t) euid;
- syscallarg(uid_t) suid;
- } */ *uap = v;
- struct pcred *pc = p->p_cred;
- uid_t ruid, euid, suid;
- int error;
-
- ruid = SCARG(uap, ruid);
- euid = SCARG(uap, euid);
- suid = SCARG(uap, suid);
-
- /*
- * Note: These checks are a little different than the OpenBSD
- * setreuid(2) call performs. This precisely follows the
- * behavior of the Linux kernel.
- */
- if (ruid != (uid_t)-1 &&
- ruid != pc->p_ruid &&
- ruid != pc->pc_ucred->cr_uid &&
- ruid != pc->p_svuid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
- return (error);
-
- if (euid != (uid_t)-1 &&
- euid != pc->p_ruid &&
- euid != pc->pc_ucred->cr_uid &&
- euid != pc->p_svuid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
- return (error);
-
- if (suid != (uid_t)-1 &&
- suid != pc->p_ruid &&
- suid != pc->pc_ucred->cr_uid &&
- suid != pc->p_svuid &&
- (error = suser(pc->pc_ucred, &p->p_acflag)))
- return (error);
-
- /*
- * Now assign the new real, effective, and saved UIDs.
- * Note that Linux, unlike OpenBSD in setreuid(2), does not
- * set the saved UID in this call unless the user specifies
- * it.
- */
- if (ruid != (uid_t)-1) {
- (void)chgproccnt(pc->p_ruid, -1);
- (void)chgproccnt(ruid, 1);
- pc->p_ruid = ruid;
- }
-
- if (euid != (uid_t)-1) {
- pc->pc_ucred = crcopy(pc->pc_ucred);
- pc->pc_ucred->cr_uid = euid;
- }
-
- if (suid != (uid_t)-1)
- pc->p_svuid = suid;
-
- if (ruid != (uid_t)-1 && euid != (uid_t)-1 && suid != (uid_t)-1)
- p->p_flag |= P_SUGID;
- return (0);
-}
-
-int
-linux_sys_getresuid(p, v, retval)
- struct proc *p;
- void *v;
- register_t *retval;
-{
- struct linux_sys_getresuid_args /* {
- syscallarg(uid_t *) ruid;
- syscallarg(uid_t *) euid;
- syscallarg(uid_t *) suid;
- } */ *uap = v;
- struct pcred *pc = p->p_cred;
- int error;
-
- /*
- * Linux copies these values out to userspace like so:
- *
- * 1. Copy out ruid.
- * 2. If that succeeds, copy out euid.
- * 3. If both of those succeed, copy out suid.
- */
- if ((error = copyout(&pc->p_ruid, SCARG(uap, ruid),
- sizeof(uid_t))) != 0)
- return (error);
-
- if ((error = copyout(&pc->pc_ucred->cr_uid, SCARG(uap, euid),
- sizeof(uid_t))) != 0)
- return (error);
-
- return (copyout(&pc->p_svuid, SCARG(uap, suid), sizeof(uid_t)));
-}
-
/*
* We have nonexistent fsuid equal to uid.
* If modification is requested, refuse.
diff --git a/sys/compat/linux/syscalls.master b/sys/compat/linux/syscalls.master
index b1dfbe05728..7e08a7175f2 100644
--- a/sys/compat/linux/syscalls.master
+++ b/sys/compat/linux/syscalls.master
@@ -1,4 +1,4 @@
- $OpenBSD: syscalls.master,v 1.35 2002/10/28 03:35:53 fgsch Exp $
+ $OpenBSD: syscalls.master,v 1.36 2002/10/30 20:10:48 millert Exp $
; $NetBSD: syscalls.master,v 1.15 1995/12/18 14:35:10 fvdl Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -269,19 +269,19 @@
struct timespec *rmtp); }
163 STD { int linux_sys_mremap(void *old_address, size_t old_size, \
size_t new_size, long flags); }
-164 STD { int linux_sys_setresuid16(uid_t ruid, uid_t euid, \
- uid_t suid); }
-165 NOARGS linux_getresuid16 { int linux_sys_getresuid( \
- uid_t *ruid, uid_t *euid, uid_t *suid); }
+164 STD { int linux_sys_setresuid16(u_int16_t ruid, \
+ u_int16_t euid, u_int16_t suid); }
+165 STD { int linux_sys_getresuid16(u_int16_t *ruid, \
+ u_int16_t *euid, u_int16_t *suid); }
166 STD { int linux_sys_vm86(void); }
167 STD { int linux_sys_query_module(void); }
168 NOARGS { int sys_poll(struct pollfd *fds, u_int nfds, \
int timeout); }
169 STD { int linux_sys_nfsservctl(void); }
-170 STD { int linux_sys_setresgid16(gid_t rgid, gid_t egid, \
- gid_t sgid); }
-171 STD { int linux_sys_getresgid16(gid_t *rgid, gid_t *egid, \
- gid_t *sgid); }
+170 STD { int linux_sys_setresgid16(u_int16_t rgid, \
+ u_int16_t egid, u_int16_t sgid); }
+171 STD { int linux_sys_getresgid16(u_int16_t *rgid, \
+ u_int16_t *egid, u_int16_t *sgid); }
172 STD { int linux_sys_prctl(void); }
173 STD { int linux_sys_rt_sigreturn( \
struct linux_rt_sigframe *sfp); }
@@ -336,11 +336,14 @@
205 NOARGS { int sys_getgroups(u_int gidsetsize, gid_t *gidset); }
206 NOARGS { int sys_setgroups(u_int gidsetsize, gid_t *gidset); }
207 NOARGS { int linux_sys_fchown(void); }
-208 NOARGS { int linux_sys_setresuid(void); }
-209 STD { int linux_sys_getresuid(uid_t *ruid, uid_t *euid, \
+208 NOARGS { int sys_setresuid(uid_t ruid, uid_t euid, \
+ uid_t suid); }
+209 NOARGS { int sys_getresuid(uid_t *ruid, uid_t *euid, \
uid_t *suid); }
-210 NOARGS { int linux_sys_setresgid(void); }
-211 NOARGS { int linux_sys_getresgid(void); }
+210 NOARGS { int sys_setresgid(gid_t rgid, gid_t egid, \
+ gid_t sgid); }
+211 NOARGS { int sys_getresgid(gid_t *rgid, gid_t *egid, \
+ gid_t *sgid); }
212 NOARGS { int linux_sys_chown(void); }
213 NOARGS { int sys_setuid(uid_t uid); }
214 NOARGS { int sys_setgid(gid_t gid); }