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 @@ | |||
18 | #include <linux/security.h> | 18 | #include <linux/security.h> |
19 | #include <linux/ima.h> | 19 | #include <linux/ima.h> |
20 | 20 | ||
21 | #define MAX_LSM_XATTR 1 | ||
22 | |||
21 | /* Boot-time LSM user choice */ | 23 | /* Boot-time LSM user choice */ |
22 | static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] = | 24 | static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] = |
23 | CONFIG_DEFAULT_SECURITY; | 25 | CONFIG_DEFAULT_SECURITY; |
@@ -339,15 +341,46 @@ void security_inode_free(struct inode *inode) | |||
339 | } | 341 | } |
340 | 342 | ||
341 | int security_inode_init_security(struct inode *inode, struct inode *dir, | 343 | int security_inode_init_security(struct inode *inode, struct inode *dir, |
342 | const struct qstr *qstr, char **name, | 344 | const struct qstr *qstr, |
343 | void **value, size_t *len) | 345 | const initxattrs initxattrs, void *fs_data) |
346 | { | ||
347 | struct xattr new_xattrs[MAX_LSM_XATTR + 1]; | ||
348 | struct xattr *lsm_xattr; | ||
349 | int ret; | ||
350 | |||
351 | if (unlikely(IS_PRIVATE(inode))) | ||
352 | return -EOPNOTSUPP; | ||
353 | |||
354 | memset(new_xattrs, 0, sizeof new_xattrs); | ||
355 | if (!initxattrs) | ||
356 | return security_ops->inode_init_security(inode, dir, qstr, | ||
357 | NULL, NULL, NULL); | ||
358 | lsm_xattr = new_xattrs; | ||
359 | ret = security_ops->inode_init_security(inode, dir, qstr, | ||
360 | &lsm_xattr->name, | ||
361 | &lsm_xattr->value, | ||
362 | &lsm_xattr->value_len); | ||
363 | if (ret) | ||
364 | goto out; | ||
365 | ret = initxattrs(inode, new_xattrs, fs_data); | ||
366 | out: | ||
367 | kfree(lsm_xattr->name); | ||
368 | kfree(lsm_xattr->value); | ||
369 | |||
370 | return (ret == -EOPNOTSUPP) ? 0 : ret; | ||
371 | } | ||
372 | EXPORT_SYMBOL(security_inode_init_security); | ||
373 | |||
374 | int security_old_inode_init_security(struct inode *inode, struct inode *dir, | ||
375 | const struct qstr *qstr, char **name, | ||
376 | void **value, size_t *len) | ||
344 | { | 377 | { |
345 | if (unlikely(IS_PRIVATE(inode))) | 378 | if (unlikely(IS_PRIVATE(inode))) |
346 | return -EOPNOTSUPP; | 379 | return -EOPNOTSUPP; |
347 | return security_ops->inode_init_security(inode, dir, qstr, name, value, | 380 | return security_ops->inode_init_security(inode, dir, qstr, name, value, |
348 | len); | 381 | len); |
349 | } | 382 | } |
350 | EXPORT_SYMBOL(security_inode_init_security); | 383 | EXPORT_SYMBOL(security_old_inode_init_security); |
351 | 384 | ||
352 | #ifdef CONFIG_SECURITY_PATH | 385 | #ifdef CONFIG_SECURITY_PATH |
353 | int security_path_mknod(struct path *dir, struct dentry *dentry, int mode, | 386 | int security_path_mknod(struct path *dir, struct dentry *dentry, int mode, |