diff options
Diffstat (limited to 'security/security.c')
| -rw-r--r-- | security/security.c | 39 | 
1 files changed, 36 insertions, 3 deletions
diff --git a/security/security.c b/security/security.c index 4ba6d4cc061..3464d58a576 100644 --- a/security/security.c +++ b/security/security.c @@ -18,6 +18,8 @@  #include <linux/security.h>  #include <linux/ima.h> +#define MAX_LSM_XATTR	1 +  /* Boot-time LSM user choice */  static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =  	CONFIG_DEFAULT_SECURITY; @@ -339,15 +341,46 @@ void security_inode_free(struct inode *inode)  }  int security_inode_init_security(struct inode *inode, struct inode *dir, -				 const struct qstr *qstr, char **name, -				 void **value, size_t *len) +				 const struct qstr *qstr, +				 const initxattrs initxattrs, void *fs_data) +{ +	struct xattr new_xattrs[MAX_LSM_XATTR + 1]; +	struct xattr *lsm_xattr; +	int ret; + +	if (unlikely(IS_PRIVATE(inode))) +		return -EOPNOTSUPP; + +	memset(new_xattrs, 0, sizeof new_xattrs); +	if (!initxattrs) +		return security_ops->inode_init_security(inode, dir, qstr, +							 NULL, NULL, NULL); +	lsm_xattr = new_xattrs; +	ret = security_ops->inode_init_security(inode, dir, qstr, +						&lsm_xattr->name, +						&lsm_xattr->value, +						&lsm_xattr->value_len); +	if (ret) +		goto out; +	ret = initxattrs(inode, new_xattrs, fs_data); +out: +	kfree(lsm_xattr->name); +	kfree(lsm_xattr->value); + +	return (ret == -EOPNOTSUPP) ? 0 : ret; +} +EXPORT_SYMBOL(security_inode_init_security); + +int security_old_inode_init_security(struct inode *inode, struct inode *dir, +				     const struct qstr *qstr, char **name, +				     void **value, size_t *len)  {  	if (unlikely(IS_PRIVATE(inode)))  		return -EOPNOTSUPP;  	return security_ops->inode_init_security(inode, dir, qstr, name, value,  						 len);  } -EXPORT_SYMBOL(security_inode_init_security); +EXPORT_SYMBOL(security_old_inode_init_security);  #ifdef CONFIG_SECURITY_PATH  int security_path_mknod(struct path *dir, struct dentry *dentry, int mode,  |