On Tue, 2005-03-22 at 19:10 -0800, Andrew Morton wrote:
There's a patch for you over on linux-mm.
Looks sane; added to the BK tree. Thanks.
Is there an audit mailing list?
There is. linux-audit(a)redhat.com
Begin forwarded message:
Date: Tue, 22 Mar 2005 19:15:02 -0800
From: pmeda(a)akamai.com
To: akpm(a)osdl.org
Cc: linux-mm(a)kvack.org
Subject: [PATCH] namei: add audit_inode to all branches in path_lookup
Main change is in path_lookup: added a goto to do audit_inode
instead of return statement, when emul_lookup_dentry for root
is successful. The existing code does audit_inode only when
lookup is done in normal root or cwd.
Other changes: Some lookup routines are returning zero on success,
and some are returning zero on failure. I documented the related
function signatures in this code path, so that one can glance over
abstract functions without understanding the entire code.
Signed-off-by: Prasanna Meda <pmeda(a)akamai.com>
--- linux/fs/namei.c Tue Mar 22 01:29:37 2005
+++ Linux/fs/namei.c Tue Mar 22 01:48:24 2005
@@ -675,11 +675,11 @@
/*
* Name resolution.
+ * This is the basic name resolution function, turning a pathname into
+ * the final dentry. We expect 'base' to be positive and a directory.
*
- * This is the basic name resolution function, turning a pathname
- * into the final dentry.
- *
- * We expect 'base' to be positive and a directory.
+ * Returns 0 and nd will have valid dentry and mnt on success.
+ * Returns error and drops reference to input namei data on failure.
*/
int fastcall link_path_walk(const char * name, struct nameidata *nd)
{
@@ -887,8 +887,10 @@
return link_path_walk(name, nd);
}
-/* SMP-safe */
-/* returns 1 if everything is done */
+/*
+ * SMP-safe: Returns 1 and nd will have valid dentry and mnt, if
+ * everything is done. Returns 0 and drops input nd, if lookup failed;
+ */
static int __emul_lookup_dentry(const char *name, struct nameidata *nd)
{
if (path_walk(name, nd))
@@ -952,9 +954,10 @@
}
}
+/* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
int fastcall path_lookup(const char *name, unsigned int flags, struct nameidata *nd)
{
- int retval;
+ int retval = 0;
nd->last_type = LAST_ROOT; /* if there are only slashes... */
nd->flags = flags;
@@ -967,7 +970,7 @@
nd->dentry = dget(current->fs->altroot);
read_unlock(¤t->fs->lock);
if (__emul_lookup_dentry(name,nd))
- return 0;
+ goto out; /* found in altroot */
read_lock(¤t->fs->lock);
}
nd->mnt = mntget(current->fs->rootmnt);
@@ -979,6 +982,7 @@
read_unlock(¤t->fs->lock);
current->total_link_count = 0;
retval = link_path_walk(name, nd);
+out:
if (unlikely(current->audit_context
&& nd && nd->dentry && nd->dentry->d_inode))
audit_inode(name,
--
dwmw2