Skip site navigation (1)Skip section navigation (2)
Date:      29 Jan 2000 13:18:13 +0100
From:      Bjoern Groenvall <bg@sics.se>
To:        Doug White <dwhite@resnet.uoregon.edu>, "F. Heinrichmeyer" <fritz.heinrichmeyer@fernuni-hagen.de>
Cc:        freebsd-emulation@freebsd.org, "freebsd-current@FreeBSD.ORG" <freebsd-current@freebsd.org>
Subject:   Re: ASDM and linux emulation?
Message-ID:  <wu66wd9im2.fsf@bg.sics.se>
In-Reply-To: Doug White's message of Sat, 29 Jan 2000 00:05:41 -0800 (PST)
References:  <Pine.BSF.4.21.0001290004140.74829-100000@resnet.uoregon.edu>

next in thread | previous in thread | raw e-mail | index | archive | help

Fritz & Doug,

Doug White <dwhite@resnet.uoregon.edu> writes:

> On Thu, 27 Jan 2000, F. Heinrichmeyer wrote:
> 
> > I would like to use an ASDM (backup software) with linux-emulation. I
> > get
> > the following in /var/log/messages:
> > 
> > es-i2 /kernel: linux: syscall setresuid is obsoleted\
> >  or not implemented (pid=41052)
> > Jan 27 13:12:42 es-i2 /kernel: pid 41052 (dsm), \
> > uid 0: exited on signal 11 (core dumped)
> 
> What FreeBSD is this?  I've run the v3 client under linux mode without bad
> syscalls (just that silly pathmunging stuff that I need to renew the fight
> over).

Perhaps you are running the backup as root while Fritz has a setuid
root program? In any case, please find attacked a patch that
implements setresuid. The patch is relative to 3.3 but should port
pretty easily to current.

Fritz, if this cures your problems, please drop me a note.

Cheers,
Björn

-- 
  _     _                                               ,_______________.  
Bjorn Gronvall (Björn Grönvall)                        /_______________/|     
Swedish Institute of Computer Science                  |               ||
PO Box 1263, S-164 29 Kista, Sweden                    | Schroedingers ||
Email: bg@sics.se, Phone +46 -8 633 15 25              |      Cat      |/
Cellular +46 -70 768 06 35, Fax +46 -8 751 72 30       `---------------' 

--- linux_misc.c	2000/01/29 10:23:54	1.1
+++ linux_misc.c	2000/01/29 11:40:28
@@ -797,6 +797,44 @@
 }
 
 int
+linux_setresuid(p, uap)
+	struct proc *p;
+	struct linux_setresuid_args *uap;
+{
+	struct setreuid_args bsd_args;
+
+	/* Allow setresuid iff the saved effective uid is left unchanged. */
+	if (uap->suid != -1 && uap->suid != p->p_cred->p_svuid) {
+		printf("Linux-emul(%d): setresuid(%d, %d, %d) not supported\n",
+		       p->p_pid, uap->ruid, uap->euid, uap->suid);
+		return ENOSYS;
+	}
+	bsd_args.ruid = uap->ruid;
+	bsd_args.euid = uap->euid;
+	/*              uap->suid is unchanged */
+	return setreuid(p, &bsd_args);
+}
+
+int
+linux_setresgid(p, uap)
+	struct proc *p;
+	struct linux_setresgid_args *uap;
+{
+	struct setregid_args bsd_args;
+
+	/* Allow setresgid iff the saved effective gid is left unchanged. */
+	if (uap->sgid != -1 && uap->sgid != p->p_cred->p_svgid) {
+		printf("Linux-emul(%d): setresgid(%d, %d, %d) not supported\n",
+		       p->p_pid, uap->rgid, uap->egid, uap->sgid);
+		return ENOSYS;
+	}
+	bsd_args.rgid = uap->rgid;
+	bsd_args.egid = uap->egid;
+	/*              uap->sgid is unchanged */
+	return setregid(p, &bsd_args);
+}
+
+int
 linux_msync(struct proc *p, struct linux_msync_args *args)
 {
 	struct msync_args bsd_args;
--- linux_proto.h	2000/01/29 10:28:59	1.1
+++ linux_proto.h	2000/01/29 11:08:53
@@ -402,6 +402,16 @@
 	int	new_len;	char new_len_[PAD_(int)];
 	int	flags;	char flags_[PAD_(int)];
 };
+struct	linux_setresuid_args {
+	int	ruid;	char ruid_[PAD_(int)];
+	int	euid;	char euid_[PAD_(int)];
+	int	suid;	char suid_[PAD_(int)];
+};
+struct	linux_setresgid_args {
+	int	rgid;	char rgid_[PAD_(int)];
+	int	egid;	char egid_[PAD_(int)];
+	int	sgid;	char sgid_[PAD_(int)];
+};
 struct	linux_rt_sigaction_args {
 	int	sig;	char sig_[PAD_(int)];
 	struct linux_new_sigaction *	act;	char act_[PAD_(struct linux_new_sigaction *)];
@@ -528,6 +538,8 @@
 int	linux_sched_setscheduler __P((struct proc *, struct linux_sched_setscheduler_args *));
 int	linux_sched_getscheduler __P((struct proc *, struct linux_sched_getscheduler_args *));
 int	linux_mremap __P((struct proc *, struct linux_mremap_args *));
+int	linux_setresuid __P((struct proc *, struct linux_setresuid_args *));
+int	linux_setresgid __P((struct proc *, struct linux_setresgid_args *));
 int	linux_rt_sigaction __P((struct proc *, struct linux_rt_sigaction_args *));
 int	linux_rt_sigprocmask __P((struct proc *, struct linux_rt_sigprocmask_args *));
 int	linux_chown __P((struct proc *, struct linux_chown_args *));
--- linux_syscall.h	2000/01/29 10:43:49	1.1
+++ linux_syscall.h	2000/01/29 11:09:30
@@ -162,7 +162,9 @@
 #define	LINUX_SYS_sched_rr_get_interval	161
 #define	LINUX_SYS_nanosleep	162
 #define	LINUX_SYS_linux_mremap	163
+#define	LINUX_SYS_linux_setresuid	164
 #define	LINUX_SYS_poll	168
+#define	LINUX_SYS_linux_setresgid	170
 #define	LINUX_SYS_linux_rt_sigaction	174
 #define	LINUX_SYS_linux_rt_sigprocmask	175
 #define	LINUX_SYS_linux_chown	182
--- linux_sysent.c	2000/01/29 10:06:22	1.1
+++ linux_sysent.c	2000/01/29 11:06:51
@@ -178,13 +178,13 @@
 	{ 2, (sy_call_t *)sched_rr_get_interval },		/* 161 = sched_rr_get_interval */
 	{ 2, (sy_call_t *)nanosleep },			/* 162 = nanosleep */
 	{ 4, (sy_call_t *)linux_mremap },		/* 163 = linux_mremap */
-	{ 0, (sy_call_t *)nosys },			/* 164 = setresuid */
+	{ 0, (sy_call_t *)linux_setresuid },		/* 164 = linux_setresuid */
 	{ 0, (sy_call_t *)nosys },			/* 165 = getresuid */
 	{ 0, (sy_call_t *)nosys },			/* 166 = new_vm86 */
 	{ 0, (sy_call_t *)nosys },			/* 167 = query_module */
 	{ 3, (sy_call_t *)poll },			/* 168 = poll */
 	{ 0, (sy_call_t *)nosys },			/* 169 = nfsservctl */
-	{ 0, (sy_call_t *)nosys },			/* 170 = setresgid */
+	{ 0, (sy_call_t *)linux_setresgid },		/* 170 = linux_setresgid */
 	{ 0, (sy_call_t *)nosys },			/* 171 = getresgid */
 	{ 0, (sy_call_t *)nosys },			/* 172 = prctl */
 	{ 0, (sy_call_t *)nosys },			/* 173 = rt_sigreturn */
--- syscalls.master	2000/01/29 10:06:58	1.1
+++ syscalls.master	2000/01/29 11:07:31
@@ -238,14 +238,14 @@
 
 163	STD	LINUX	{ int linux_mremap(caddr_t addr, int old_len, \
 			    int new_len, int flags); }
-164	UNIMPL	LINUX	setresuid
+164	STD	LINUX	{ int linux_setresuid(int ruid, int euid, int suid); }
 165	UNIMPL	LINUX	getresuid
 166	UNIMPL	LINUX	new_vm86
 167	UNIMPL	LINUX	query_module
 168	NOPROTO	LINUX	{ int poll(struct pollfd*, unsigned int nfds, \
 				   long timeout); }
 169	UNIMPL	LINUX	nfsservctl
-170	UNIMPL	LINUX	setresgid
+170	STD	LINUX	{ int linux_setresgid(int rgid, int egid, int sgid); }
 171	UNIMPL	LINUX	getresgid
 172	UNIMPL	LINUX	prctl
 173	UNIMPL	LINUX	rt_sigreturn


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-emulation" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?wu66wd9im2.fsf>