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@akamai.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
Prasanna Meda 2005-04-29 16:00:17 +01:00 committed by
parent 81b7854d52
commit ea3834d9fb

View File

@ -686,11 +686,11 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
/* /*
* Name resolution. * 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 * Returns 0 and nd will have valid dentry and mnt on success.
* into the final dentry. * Returns error and drops reference to input namei data on failure.
*
* We expect 'base' to be positive and a directory.
*/ */
static fastcall int __link_path_walk(const char * name, struct nameidata *nd) static fastcall int __link_path_walk(const char * name, struct nameidata *nd)
{ {
@ -929,8 +929,10 @@ int fastcall path_walk(const char * name, struct nameidata *nd)
return link_path_walk(name, nd); 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) static int __emul_lookup_dentry(const char *name, struct nameidata *nd)
{ {
if (path_walk(name, nd)) if (path_walk(name, nd))
@ -994,9 +996,10 @@ void set_fs_altroot(void)
} }
} }
/* 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 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->last_type = LAST_ROOT; /* if there are only slashes... */
nd->flags = flags; nd->flags = flags;
@ -1009,7 +1012,7 @@ int fastcall path_lookup(const char *name, unsigned int flags, struct nameidata
nd->dentry = dget(current->fs->altroot); nd->dentry = dget(current->fs->altroot);
read_unlock(&current->fs->lock); read_unlock(&current->fs->lock);
if (__emul_lookup_dentry(name,nd)) if (__emul_lookup_dentry(name,nd))
return 0; goto out; /* found in altroot */
read_lock(&current->fs->lock); read_lock(&current->fs->lock);
} }
nd->mnt = mntget(current->fs->rootmnt); nd->mnt = mntget(current->fs->rootmnt);
@ -1021,6 +1024,7 @@ int fastcall path_lookup(const char *name, unsigned int flags, struct nameidata
read_unlock(&current->fs->lock); read_unlock(&current->fs->lock);
current->total_link_count = 0; current->total_link_count = 0;
retval = link_path_walk(name, nd); retval = link_path_walk(name, nd);
out:
if (unlikely(current->audit_context if (unlikely(current->audit_context
&& nd && nd->dentry && nd->dentry->d_inode)) && nd && nd->dentry && nd->dentry->d_inode))
audit_inode(name, nd->dentry->d_inode); audit_inode(name, nd->dentry->d_inode);