diff options
Diffstat (limited to 'security')
-rw-r--r-- | security/smack/smack_lsm.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index a5d86ffbf9a0..3d1c9086d0d6 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
@@ -1026,18 +1026,31 @@ static int smack_inode_removexattr(struct dentry *dentry, const char *name) | |||
1026 | } else | 1026 | } else |
1027 | rc = cap_inode_removexattr(dentry, name); | 1027 | rc = cap_inode_removexattr(dentry, name); |
1028 | 1028 | ||
1029 | if (rc != 0) | ||
1030 | return rc; | ||
1031 | |||
1029 | smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); | 1032 | smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_DENTRY); |
1030 | smk_ad_setfield_u_fs_path_dentry(&ad, dentry); | 1033 | smk_ad_setfield_u_fs_path_dentry(&ad, dentry); |
1031 | if (rc == 0) | ||
1032 | rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE, &ad); | ||
1033 | 1034 | ||
1034 | if (rc == 0) { | 1035 | rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE, &ad); |
1035 | isp = dentry->d_inode->i_security; | 1036 | if (rc != 0) |
1037 | return rc; | ||
1038 | |||
1039 | isp = dentry->d_inode->i_security; | ||
1040 | /* | ||
1041 | * Don't do anything special for these. | ||
1042 | * XATTR_NAME_SMACKIPIN | ||
1043 | * XATTR_NAME_SMACKIPOUT | ||
1044 | * XATTR_NAME_SMACKEXEC | ||
1045 | */ | ||
1046 | if (strcmp(name, XATTR_NAME_SMACK) == 0) | ||
1036 | isp->smk_task = NULL; | 1047 | isp->smk_task = NULL; |
1048 | else if (strcmp(name, XATTR_NAME_SMACKMMAP) == 0) | ||
1037 | isp->smk_mmap = NULL; | 1049 | isp->smk_mmap = NULL; |
1038 | } | 1050 | else if (strcmp(name, XATTR_NAME_SMACKTRANSMUTE) == 0) |
1051 | isp->smk_flags &= ~SMK_INODE_TRANSMUTE; | ||
1039 | 1052 | ||
1040 | return rc; | 1053 | return 0; |
1041 | } | 1054 | } |
1042 | 1055 | ||
1043 | /** | 1056 | /** |