Subject: Incorrect Account of Super-user Privs in ufs_setattr()?
To: None <tech-kern@netbsd.org>
From: Chris Jepeway <jepeway@blasted-heath.com>
List: tech-kern
Date: 01/31/2002 17:23:21
If the ASU bit in a process's p_acflag means "process had
to use root's privileges to do something that a non-root
process can't do," then I think ufs_setattr() isn't
doing the right thing when checking whether the times on
a file may be set.

My understanding is that VOP_SETATTR() should allow
a process to set a file's times when any of the
following are true:

	o  process owns the file

	o  process has super-user privs

	o  process can write to the file
		and process is setting
		times to "now"

An excerpt of the code that checks this, from 
v. 1.85 of ufs/ufs/ufs_vnops.c:

    if (cred->cr_uid != ip->i_ffs_uid &&
       (error = suser(cred, &p->p_acflag)) &&
       ((vap->va_vaflags & VA_UTIMES_NULL) == 0 || 
	(error = VOP_ACCESS(vp, VWRITE, cred, p))))
	    return (error);

I think that when the following conditions hold

	o  process is super-user

	o  time is being set to now

	o  file is writable by a group
		to which root belongs

then the process will be charged with use of 
super-user privs when perhaps it should not
have been.

Have I got this right?  Should the suser() check
be moved to the end of the conditional?

Chris <jepeway@blasted-heath.com>.