diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
| commit | 7731b8bc94e599c9a79e428f3359ff2c34b7576a (patch) | |
| tree | 879f18ccbe274122f2d4f095b43cbc7f953e0ada /security/integrity/evm/evm_main.c | |
| parent | 48e315618dc4dc8904182cd221e3d395d5d97005 (diff) | |
| parent | 9ffc59d57228d74809700be6f7ecb1db10292f05 (diff) | |
Merge branch 'linus' into x86/urgent
Required to queue a dependent fix.
Diffstat (limited to 'security/integrity/evm/evm_main.c')
| -rw-r--r-- | security/integrity/evm/evm_main.c | 79 | 
1 files changed, 46 insertions, 33 deletions
diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c index 9ea9c19a545c..f9eff5041e4c 100644 --- a/security/integrity/evm/evm_main.c +++ b/security/integrity/evm/evm_main.c @@ -35,28 +35,29 @@ static const char * const integrity_status_msg[] = {  };  int evm_hmac_attrs; -char *evm_config_xattrnames[] = { +static struct xattr_list evm_config_default_xattrnames[] = {  #ifdef CONFIG_SECURITY_SELINUX -	XATTR_NAME_SELINUX, +	{.name = XATTR_NAME_SELINUX},  #endif  #ifdef CONFIG_SECURITY_SMACK -	XATTR_NAME_SMACK, +	{.name = XATTR_NAME_SMACK},  #ifdef CONFIG_EVM_EXTRA_SMACK_XATTRS -	XATTR_NAME_SMACKEXEC, -	XATTR_NAME_SMACKTRANSMUTE, -	XATTR_NAME_SMACKMMAP, +	{.name = XATTR_NAME_SMACKEXEC}, +	{.name = XATTR_NAME_SMACKTRANSMUTE}, +	{.name = XATTR_NAME_SMACKMMAP},  #endif  #endif  #ifdef CONFIG_SECURITY_APPARMOR -	XATTR_NAME_APPARMOR, +	{.name = XATTR_NAME_APPARMOR},  #endif  #ifdef CONFIG_IMA_APPRAISE -	XATTR_NAME_IMA, +	{.name = XATTR_NAME_IMA},  #endif -	XATTR_NAME_CAPS, -	NULL +	{.name = XATTR_NAME_CAPS},  }; +LIST_HEAD(evm_config_xattrnames); +  static int evm_fixmode;  static int __init evm_set_fixmode(char *str)  { @@ -68,6 +69,17 @@ __setup("evm=", evm_set_fixmode);  static void __init evm_init_config(void)  { +	int i, xattrs; + +	xattrs = ARRAY_SIZE(evm_config_default_xattrnames); + +	pr_info("Initialising EVM extended attributes:\n"); +	for (i = 0; i < xattrs; i++) { +		pr_info("%s\n", evm_config_default_xattrnames[i].name); +		list_add_tail(&evm_config_default_xattrnames[i].list, +			      &evm_config_xattrnames); +	} +  #ifdef CONFIG_EVM_ATTR_FSUUID  	evm_hmac_attrs |= EVM_ATTR_FSUUID;  #endif @@ -82,15 +94,15 @@ static bool evm_key_loaded(void)  static int evm_find_protected_xattrs(struct dentry *dentry)  {  	struct inode *inode = d_backing_inode(dentry); -	char **xattr; +	struct xattr_list *xattr;  	int error;  	int count = 0;  	if (!(inode->i_opflags & IOP_XATTR))  		return -EOPNOTSUPP; -	for (xattr = evm_config_xattrnames; *xattr != NULL; xattr++) { -		error = __vfs_getxattr(dentry, inode, *xattr, NULL, 0); +	list_for_each_entry_rcu(xattr, &evm_config_xattrnames, list) { +		error = __vfs_getxattr(dentry, inode, xattr->name, NULL, 0);  		if (error < 0) {  			if (error == -ENODATA)  				continue; @@ -211,24 +223,25 @@ out:  static int evm_protected_xattr(const char *req_xattr_name)  { -	char **xattrname;  	int namelen;  	int found = 0; +	struct xattr_list *xattr;  	namelen = strlen(req_xattr_name); -	for (xattrname = evm_config_xattrnames; *xattrname != NULL; xattrname++) { -		if ((strlen(*xattrname) == namelen) -		    && (strncmp(req_xattr_name, *xattrname, namelen) == 0)) { +	list_for_each_entry_rcu(xattr, &evm_config_xattrnames, list) { +		if ((strlen(xattr->name) == namelen) +		    && (strncmp(req_xattr_name, xattr->name, namelen) == 0)) {  			found = 1;  			break;  		}  		if (strncmp(req_xattr_name, -			    *xattrname + XATTR_SECURITY_PREFIX_LEN, +			    xattr->name + XATTR_SECURITY_PREFIX_LEN,  			    strlen(req_xattr_name)) == 0) {  			found = 1;  			break;  		}  	} +  	return found;  } @@ -544,35 +557,35 @@ void __init evm_load_x509(void)  static int __init init_evm(void)  {  	int error; +	struct list_head *pos, *q; +	struct xattr_list *xattr;  	evm_init_config();  	error = integrity_init_keyring(INTEGRITY_KEYRING_EVM);  	if (error) -		return error; +		goto error;  	error = evm_init_secfs();  	if (error < 0) {  		pr_info("Error registering secfs\n"); -		return error; +		goto error;  	} -	return 0; -} - -/* - * evm_display_config - list the EVM protected security extended attributes - */ -static int __init evm_display_config(void) -{ -	char **xattrname; +error: +	if (error != 0) { +		if (!list_empty(&evm_config_xattrnames)) { +			list_for_each_safe(pos, q, &evm_config_xattrnames) { +				xattr = list_entry(pos, struct xattr_list, +						   list); +				list_del(pos); +			} +		} +	} -	for (xattrname = evm_config_xattrnames; *xattrname != NULL; xattrname++) -		pr_info("%s\n", *xattrname); -	return 0; +	return error;  } -pure_initcall(evm_display_config);  late_initcall(init_evm);  MODULE_DESCRIPTION("Extended Verification Module");  | 
