diff options
Diffstat (limited to 'security/tomoyo/realpath.c')
| -rw-r--r-- | security/tomoyo/realpath.c | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/security/tomoyo/realpath.c b/security/tomoyo/realpath.c index 5f2e3326337..18369d497eb 100644 --- a/security/tomoyo/realpath.c +++ b/security/tomoyo/realpath.c @@ -13,6 +13,8 @@  #include <linux/mount.h>  #include <linux/mnt_namespace.h>  #include <linux/fs_struct.h> +#include <linux/hash.h> +  #include "common.h"  #include "realpath.h" @@ -108,6 +110,15 @@ int tomoyo_realpath_from_path2(struct path *path, char *newname,  		spin_unlock(&dcache_lock);  		path_put(&root);  		path_put(&ns_root); +		/* Prepend "/proc" prefix if using internal proc vfs mount. */ +		if (!IS_ERR(sp) && (path->mnt->mnt_parent == path->mnt) && +		    (strcmp(path->mnt->mnt_sb->s_type->name, "proc") == 0)) { +			sp -= 5; +			if (sp >= newname) +				memcpy(sp, "/proc", 5); +			else +				sp = ERR_PTR(-ENOMEM); +		}  	}  	if (IS_ERR(sp))  		error = PTR_ERR(sp); @@ -263,7 +274,8 @@ static unsigned int tomoyo_quota_for_savename;   * table. Frequency of appending strings is very low. So we don't need   * large (e.g. 64k) hash size. 256 will be sufficient.   */ -#define TOMOYO_MAX_HASH 256 +#define TOMOYO_HASH_BITS  8 +#define TOMOYO_MAX_HASH (1u<<TOMOYO_HASH_BITS)  /*   * tomoyo_name_entry is a structure which is used for linking @@ -315,6 +327,7 @@ const struct tomoyo_path_info *tomoyo_save_name(const char *name)  	struct tomoyo_free_memory_block_list *fmb;  	int len;  	char *cp; +	struct list_head *head;  	if (!name)  		return NULL; @@ -325,9 +338,10 @@ const struct tomoyo_path_info *tomoyo_save_name(const char *name)  		return NULL;  	}  	hash = full_name_hash((const unsigned char *) name, len - 1); +	head = &tomoyo_name_list[hash_long(hash, TOMOYO_HASH_BITS)]; +  	mutex_lock(&lock); -	list_for_each_entry(ptr, &tomoyo_name_list[hash % TOMOYO_MAX_HASH], -			     list) { +	list_for_each_entry(ptr, head, list) {  		if (hash == ptr->entry.hash && !strcmp(name, ptr->entry.name))  			goto out;  	} @@ -365,7 +379,7 @@ const struct tomoyo_path_info *tomoyo_save_name(const char *name)  	tomoyo_fill_path_info(&ptr->entry);  	fmb->ptr += len;  	fmb->len -= len; -	list_add_tail(&ptr->list, &tomoyo_name_list[hash % TOMOYO_MAX_HASH]); +	list_add_tail(&ptr->list, head);  	if (fmb->len == 0) {  		list_del(&fmb->list);  		kfree(fmb);  |