Implement setres[ug]id() and getres[ug]id(). This has been sitting in

my tree for ages (~2 years) waiting for an excuse to commit it.  Now Linux
has implemented it and it seems that Staroffice (when using the
linux_base6.1 port's libc) calls this in the linux emulator and dies in
setup.  The Linux emulator can call these now.
This commit is contained in:
peter 2000-01-16 16:34:26 +00:00
parent 0a471babfd
commit 75fd4c5f10
8 changed files with 214 additions and 14 deletions

View File

@ -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 */
};

View File

@ -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;

View File

@ -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 */
};

View File

@ -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); }

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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