diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/audit.h | 5 | ||||
| -rw-r--r-- | kernel/audit_watch.c | 3 | ||||
| -rw-r--r-- | kernel/auditfilter.c | 16 | ||||
| -rw-r--r-- | kernel/auditsc.c | 8 | 
4 files changed, 20 insertions, 12 deletions
diff --git a/kernel/audit.h b/kernel/audit.h index 1038e23eb61..d51cba868e1 100644 --- a/kernel/audit.h +++ b/kernel/audit.h @@ -74,12 +74,15 @@ static inline int audit_hash_ino(u32 ino)  	return (ino & (AUDIT_INODE_BUCKETS-1));  } +/* Indicates that audit should log the full pathname. */ +#define AUDIT_NAME_FULL -1 +  extern int audit_match_class(int class, unsigned syscall);  extern int audit_comparator(const u32 left, const u32 op, const u32 right);  extern int audit_uid_comparator(kuid_t left, u32 op, kuid_t right);  extern int audit_gid_comparator(kgid_t left, u32 op, kgid_t right);  extern int parent_len(const char *path); -extern int audit_compare_dname_path(const char *dname, const char *path); +extern int audit_compare_dname_path(const char *dname, const char *path, int plen);  extern struct sk_buff *	    audit_make_reply(int pid, int seq, int type,  					     int done, int multi,  					     const void *payload, int size); diff --git a/kernel/audit_watch.c b/kernel/audit_watch.c index deb97c139e0..9a9ae6e3d29 100644 --- a/kernel/audit_watch.c +++ b/kernel/audit_watch.c @@ -265,7 +265,8 @@ static void audit_update_watch(struct audit_parent *parent,  	/* Run all of the watches on this parent looking for the one that  	 * matches the given dname */  	list_for_each_entry_safe(owatch, nextw, &parent->watches, wlist) { -		if (audit_compare_dname_path(dname, owatch->path)) +		if (audit_compare_dname_path(dname, owatch->path, +					     AUDIT_NAME_FULL))  			continue;  		/* If the update involves invalidating rules, do the inode-based diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index d705eb17661..7f19f23d38a 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1328,11 +1328,17 @@ int parent_len(const char *path)  	return p - path;  } -/* Compare given dentry name with last component in given path, - * return of 0 indicates a match. */ -int audit_compare_dname_path(const char *dname, const char *path) +/** + * audit_compare_dname_path - compare given dentry name with last component in + * 			      given path. Return of 0 indicates a match. + * @dname:	dentry name that we're comparing + * @path:	full pathname that we're comparing + * @parentlen:	length of the parent if known. Passing in AUDIT_NAME_FULL + * 		here indicates that we must compute this value. + */ +int audit_compare_dname_path(const char *dname, const char *path, int parentlen)  { -	int dlen, pathlen, parentlen; +	int dlen, pathlen;  	const char *p;  	dlen = strlen(dname); @@ -1340,7 +1346,7 @@ int audit_compare_dname_path(const char *dname, const char *path)  	if (pathlen < dlen)  		return 1; -	parentlen = parent_len(path); +	parentlen = parentlen == AUDIT_NAME_FULL ? parent_len(path) : parentlen;  	if (pathlen - parentlen != dlen)  		return 1; diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 09c7b6b4f8e..0160a68b4d7 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -81,9 +81,6 @@   * a name dynamically and also add those to the list anchored by names_list. */  #define AUDIT_NAMES	5 -/* Indicates that audit should log the full pathname. */ -#define AUDIT_NAME_FULL -1 -  /* no execve audit message should be longer than this (userspace limits) */  #define MAX_EXECVE_AUDIT_LEN 7500 @@ -2222,7 +2219,7 @@ void __audit_inode_child(const struct inode *parent,  			continue;  		if (n->ino == parent->i_ino && -		    !audit_compare_dname_path(dname, n->name)) { +		    !audit_compare_dname_path(dname, n->name, n->name_len)) {  			found_parent = n->name;  			goto add_names;  		} @@ -2235,7 +2232,8 @@ void __audit_inode_child(const struct inode *parent,  		/* strcmp() is the more likely scenario */  		if (!strcmp(dname, n->name) || -		     !audit_compare_dname_path(dname, n->name)) { +		    !audit_compare_dname_path(dname, n->name, +						AUDIT_NAME_FULL)) {  			if (inode)  				audit_copy_inode(n, dentry, inode);  			else  |