Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Feb 2000 23:30:52 +0100 (CET)
From:      bg@sics.se
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        bg@sics.se
Subject:   kern/16993: Linux emulator lacks setfsuid and setfsgid
Message-ID:  <200002252230.XAA02587@bg.sics.se>

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

>Number:         16993
>Category:       kern
>Synopsis:       Linux emulator lacks setfsuid and setfsgid
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Feb 25 14:40:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     Bjoern Groenvall
>Release:        FreeBSD 3.4-RELEASE i386
>Organization:
SICS
>Environment:

FreeBSD 3.4-RELEASE.
Same problem exists under -current.

>Description:

Legato NetWorker has programs nsrwatch and nsradmin that don't work
under the Linux emulator because the setfsuid and setfsgid system
calls are missing.

>How-To-Repeat:

Run the following Linux program

int
main()
{
  setfsuid(geteuid());
}

and you will get a core dump.

>Fix:
	
Patch relative to FreeBSD 3.4-RELEASE.

Note that setfsuid is defined to return the current value of fsuid on
error rather than an error (sic).

--- linux_misc.c	2000/02/25 21:06:01	1.1
+++ linux_misc.c	2000/02/25 22:16:35
@@ -1366,3 +1366,23 @@
 
 	return error;
 }
+
+int
+linux_setfsuid(struct proc *p, struct linux_setfsuid_args *args)
+{
+	p->p_retval[0] = p->p_ucred->cr_uid;
+	if (args->uid == p->p_ucred->cr_uid)
+		return 0;
+	printf("Linux-emul(%d): setfsuid(%d) ignored\n", p->p_pid, args->uid);
+	return 0;
+}
+
+int
+linux_setfsgid(struct proc *p, struct linux_setfsgid_args *args)
+{
+	p->p_retval[0] = p->p_ucred->cr_gid;
+	if (args->gid == p->p_ucred->cr_gid)
+		return 0;
+	printf("Linux-emul(%d): setfsgid(%d) ignored\n", p->p_pid, args->gid);
+	return 0;
+}
--- linux_proto.h	2000/02/25 20:21:50	1.1
+++ linux_proto.h	2000/02/25 21:05:08
@@ -363,6 +363,12 @@
 struct	linux_bdflush_args {
 	register_t dummy;
 };
+struct	linux_setfsuid_args {
+	int     uid;    char uid_[PAD_(int)];
+};
+struct	linux_setfsgid_args {
+	int     gid;    char gid_[PAD_(int)];
+};
 struct	linux_personality_args {
 	int	per;	char per_[PAD_(int)];
 };
@@ -529,6 +535,8 @@
 int	linux_quotactl __P((struct proc *, struct linux_quotactl_args *));
 int	linux_getpgid __P((struct proc *, struct linux_getpgid_args *));
 int	linux_bdflush __P((struct proc *, struct linux_bdflush_args *));
+int	linux_setfsuid __P((struct proc *, struct linux_setfsuid_args *));
+int	linux_setfsgid __P((struct proc *, struct linux_setfsgid_args *));
 int	linux_personality __P((struct proc *, struct linux_personality_args *));
 int	linux_llseek __P((struct proc *, struct linux_llseek_args *));
 int	linux_getdents __P((struct proc *, struct linux_getdents_args *));
--- linux_sysent.c	2000/02/25 20:18:49	1.1
+++ linux_sysent.c	2000/02/25 21:02:20
@@ -153,8 +153,8 @@
 	{ 0, (sy_call_t *)nosys },			/* 135 = sysfs */
 	{ 1, (sy_call_t *)linux_personality },		/* 136 = linux_personality */
 	{ 0, (sy_call_t *)nosys },			/* 137 = afs_syscall */
-	{ 0, (sy_call_t *)nosys },			/* 138 = setfsuid */
-	{ 0, (sy_call_t *)nosys },			/* 139 = getfsuid */
+	{ 0, (sy_call_t *)linux_setfsuid },		/* 138 = linux_setfsuid */
+	{ 0, (sy_call_t *)linux_setfsgid },		/* 139 = linux_setfsgid */
 	{ 5, (sy_call_t *)linux_llseek },		/* 140 = linux_llseek */
 	{ 3, (sy_call_t *)linux_getdents },		/* 141 = linux_getdents */
 	{ 5, (sy_call_t *)linux_newselect },		/* 142 = linux_newselect */
--- syscalls.master	2000/02/25 20:19:23	1.1
+++ syscalls.master	2000/02/25 21:01:24
@@ -195,8 +195,8 @@
 135	UNIMPL	LINUX	sysfs
 136	STD	LINUX	{ int linux_personality(int per); }
 137	UNIMPL	LINUX	afs_syscall
-138	UNIMPL	LINUX	setfsuid
-139	UNIMPL	LINUX	getfsuid
+138	STD	LINUX	linux_setfsuid
+139	STD	LINUX	linux_setfsgid
 140	STD	LINUX	{ int linux_llseek(int fd, u_int32_t ohigh, \
 			    u_int32_t olow, caddr_t res, int whence); }
 141	STD	LINUX	{ int linux_getdents(int fd, void *dent, \

>Release-Note:
>Audit-Trail:
>Unformatted:


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




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