|
@@ -18,6 +18,8 @@
|
|
#include <linux/security.h>
|
|
#include <linux/security.h>
|
|
#include <linux/ima.h>
|
|
#include <linux/ima.h>
|
|
|
|
|
|
|
|
+#define MAX_LSM_XATTR 1
|
|
|
|
+
|
|
/* Boot-time LSM user choice */
|
|
/* Boot-time LSM user choice */
|
|
static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
|
|
static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
|
|
CONFIG_DEFAULT_SECURITY;
|
|
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,
|
|
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)))
|
|
if (unlikely(IS_PRIVATE(inode)))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
return security_ops->inode_init_security(inode, dir, qstr, name, value,
|
|
return security_ops->inode_init_security(inode, dir, qstr, name, value,
|
|
len);
|
|
len);
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL(security_inode_init_security);
|
|
|
|
|
|
+EXPORT_SYMBOL(security_old_inode_init_security);
|
|
|
|
|
|
#ifdef CONFIG_SECURITY_PATH
|
|
#ifdef CONFIG_SECURITY_PATH
|
|
int security_path_mknod(struct path *dir, struct dentry *dentry, int mode,
|
|
int security_path_mknod(struct path *dir, struct dentry *dentry, int mode,
|