On Thursday 24 March 2005 01:32 pm, Stephen Smalley wrote:
 On Thu, 2005-03-24 at 14:23 -0500, Stephen Smalley wrote:
 > Then I start to see some audit messages during passwd, but I shouldn't
 > have to request read access auditing in order to see modifications
 > (especially as that will generate a lot more data, e.g. upon every
 > authentication program's use of /etc/shadow).
 Ok, I see what is happening.  You call audit_attach_watch() from d_move,
 but you will never hit an audit_notify_watch(), hence no audit data upon
 renames until a subsequent write to the existing file (which never
 happens for /etc/shadow, as it is always re-created and renamed for each
 transaction).  So a natural question is what else should be calling
 audit_notify_watch besides permission, exec_permission_lite, and
 may_delete?  d_move?  may_create? 
Though the dnotify assessment happens in a later message,  I think this is a 
good approach.  But, yes, back to expected messages missing, I was missing 
records too for unlink() -- What is boiled down to was I was making the wrong 
statement when filtering in audit_notify_watch():
static inline int may_delete(struct inode *dir,struct dentry *victim, int 
isdir)
{
	....
	audit_notify_watch(victim->d_inode, 0);
	....
}
void audit_notify_watch(struct inode *inode, int mask)
{
	.....
	// Doh! The mask==0 for may_delete's hook, thus we bottom out here
	if (!mask || (wentry->w_watch->perms &&
!(wentry->w_watch->perms&mask)))
		return;
	.....
}
This statement really should be:
if (mask && (wentry->w_watch->perms &&
!(wentry->w_watch->perms&mask)))
We treat a mask==0 as, "no permissions filtering needed", thus we don't need
to check for it in the w_watch->perms.  We also treat a w_watch->perms==0 
(which is the default) similarly as "no permissions filtering required".
-tim