Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 13 Aug 1995 15:09:18 +0200 (MET DST)
From:      roberto@blaise.ibp.fr (Ollivier Robert)
To:        wosch@cs.tu-berlin.de
Cc:        current@FreeBSD.org (Current's list FreeBSD), davidg@FreeBSD.org
Subject:   Re: kern/679: chown(2) ignores set-user-id and set-group-id bits for root
Message-ID:  <199508131309.PAA28497@blaise.ibp.fr>
In-Reply-To: <199508130851.KAA00428@localhost> from "Wolfram Schneider" at Aug 13, 95 10:51:52 am

next in thread | previous in thread | raw e-mail | index | archive | help
> That's all right and should not been changed. Unfortunately chown
> does not clear set-user-id and set-group-id bits if you are root.
> 
> $ touch Grunewald
> $ chmod 4777 Grunewald 
> $ ls -lg Grunewald 
> -rwsrwxrwx  1 wosch  wheel  0 Aug 13 10:38 Grunewald
> 
> $ su root
> # chown bin Grunewald 
> # ls -lg Grunewald 
> -rwsrwxrwx  1 bin  wheel  0 Aug 13 10:38 Grunewald
>    ^          ^^^
> >Fix:

I suggest the following patch (please review it David):

PS: be gentle, it is my first attempt at kernel hacking :-)
    I can probably do the same thing without ovattr but it
    seems cleaner to do it that way as only modified fields
    are initialized in vattr. I didn't bothered to clear the
    sticky bit because I don't see it as a problem but it
    is easy to add it.

It works here:
207 [15:03] roberto@keltia:/var/tmp> ll foo
-r-sr-sr-x  1 roberto  wheel  0 Aug 13 14:51 foo*
208 [15:03] roberto@keltia:~> ...
Password:
209 [15:04] root@keltia:/var/tmp# chown bin foo
210 [15:04] root@keltia:/var/tmp# ll foo
-r-xr-xr-x  1 bin  wheel  0 Aug 13 14:51 foo*

Index: vfs_syscalls.c
===================================================================
RCS file: /spare/FreeBSD-current/src/sys/kern/vfs_syscalls.c,v
retrieving revision 1.30
diff -u -r1.30 vfs_syscalls.c
--- 1.30	1995/08/01 18:50:39
+++ vfs_syscalls.c	1995/08/13 12:09:43
@@ -1526,6 +1526,7 @@
 	int *retval;
 {
 	register struct vnode *vp;
+	struct vattr ovattr;
 	struct vattr vattr;
 	int error;
 	struct nameidata nd;
@@ -1540,9 +1541,15 @@
 	if (vp->v_mount->mnt_flag & MNT_RDONLY)
 		error = EROFS;
 	else {
+		error = VOP_GETATTR(vp, &ovattr, p->p_ucred, p);        
+		if (error) {
+			vput(vp);
+			return (error);
+		}
 		VATTR_NULL(&vattr);
 		vattr.va_uid = uap->uid;
 		vattr.va_gid = uap->gid;
+		vattr.va_mode = ovattr.va_mode & ~(VSUID | VSGID);
 		error = VOP_SETATTR(vp, &vattr, p->p_ucred, p);
 	}
 	vput(vp);
@@ -1564,6 +1571,7 @@
 	register struct fchown_args *uap;
 	int *retval;
 {
+	struct vattr ovattr;
 	struct vattr vattr;
 	struct vnode *vp;
 	struct file *fp;
@@ -1578,9 +1586,15 @@
 	if (vp->v_mount->mnt_flag & MNT_RDONLY)
 		error = EROFS;
 	else {
+		error = VOP_GETATTR(vp, &ovattr, p->p_ucred, p);        
+		if (error) {
+			VOP_UNLOCK(vp);
+			return (error);
+		}
 		VATTR_NULL(&vattr);
 		vattr.va_uid = uap->uid;
 		vattr.va_gid = uap->gid;
+		vattr.va_mode = ovattr.va_mode & ~(VSUID | VSGID);
 		error = VOP_SETATTR(vp, &vattr, p->p_ucred, p);
 	}
 	VOP_UNLOCK(vp);

-- 
Ollivier ROBERT     -=- The daemon is FREE! -=-     roberto@FreeBSD.ORG
      FreeBSD 2.2-CURRENT #5: Fri Jul 14 12:28:04 MET DST 1995



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