|
@@ -1447,8 +1447,11 @@ static int task_has_capability(struct task_struct *tsk,
|
|
|
}
|
|
|
|
|
|
rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
|
|
|
- if (audit == SECURITY_CAP_AUDIT)
|
|
|
- avc_audit(sid, sid, sclass, av, &avd, rc, &ad);
|
|
|
+ if (audit == SECURITY_CAP_AUDIT) {
|
|
|
+ int rc2 = avc_audit(sid, sid, sclass, av, &avd, rc, &ad, 0);
|
|
|
+ if (rc2)
|
|
|
+ return rc2;
|
|
|
+ }
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -1468,7 +1471,8 @@ static int task_has_system(struct task_struct *tsk,
|
|
|
static int inode_has_perm(const struct cred *cred,
|
|
|
struct inode *inode,
|
|
|
u32 perms,
|
|
|
- struct common_audit_data *adp)
|
|
|
+ struct common_audit_data *adp,
|
|
|
+ unsigned flags)
|
|
|
{
|
|
|
struct inode_security_struct *isec;
|
|
|
struct common_audit_data ad;
|
|
@@ -1488,7 +1492,7 @@ static int inode_has_perm(const struct cred *cred,
|
|
|
ad.u.fs.inode = inode;
|
|
|
}
|
|
|
|
|
|
- return avc_has_perm(sid, isec->sid, isec->sclass, perms, adp);
|
|
|
+ return avc_has_perm_flags(sid, isec->sid, isec->sclass, perms, adp, flags);
|
|
|
}
|
|
|
|
|
|
/* Same as inode_has_perm, but pass explicit audit data containing
|
|
@@ -1505,7 +1509,7 @@ static inline int dentry_has_perm(const struct cred *cred,
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, FS);
|
|
|
ad.u.fs.path.mnt = mnt;
|
|
|
ad.u.fs.path.dentry = dentry;
|
|
|
- return inode_has_perm(cred, inode, av, &ad);
|
|
|
+ return inode_has_perm(cred, inode, av, &ad, 0);
|
|
|
}
|
|
|
|
|
|
/* Check whether a task can use an open file descriptor to
|
|
@@ -1541,7 +1545,7 @@ static int file_has_perm(const struct cred *cred,
|
|
|
/* av is zero if only checking access to the descriptor. */
|
|
|
rc = 0;
|
|
|
if (av)
|
|
|
- rc = inode_has_perm(cred, inode, av, &ad);
|
|
|
+ rc = inode_has_perm(cred, inode, av, &ad, 0);
|
|
|
|
|
|
out:
|
|
|
return rc;
|
|
@@ -2103,7 +2107,7 @@ static inline void flush_unauthorized_files(const struct cred *cred,
|
|
|
file = file_priv->file;
|
|
|
inode = file->f_path.dentry->d_inode;
|
|
|
if (inode_has_perm(cred, inode,
|
|
|
- FILE__READ | FILE__WRITE, NULL)) {
|
|
|
+ FILE__READ | FILE__WRITE, NULL, 0)) {
|
|
|
drop_tty = 1;
|
|
|
}
|
|
|
}
|
|
@@ -2649,10 +2653,6 @@ static int selinux_inode_permission(struct inode *inode, int mask, unsigned flag
|
|
|
if (!mask)
|
|
|
return 0;
|
|
|
|
|
|
- /* May be droppable after audit */
|
|
|
- if (flags & IPERM_FLAG_RCU)
|
|
|
- return -ECHILD;
|
|
|
-
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, FS);
|
|
|
ad.u.fs.inode = inode;
|
|
|
|
|
@@ -2661,7 +2661,7 @@ static int selinux_inode_permission(struct inode *inode, int mask, unsigned flag
|
|
|
|
|
|
perms = file_mask_to_av(inode->i_mode, mask);
|
|
|
|
|
|
- return inode_has_perm(cred, inode, perms, &ad);
|
|
|
+ return inode_has_perm(cred, inode, perms, &ad, flags);
|
|
|
}
|
|
|
|
|
|
static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
|
|
@@ -3208,7 +3208,7 @@ static int selinux_dentry_open(struct file *file, const struct cred *cred)
|
|
|
* new inode label or new policy.
|
|
|
* This check is not redundant - do not remove.
|
|
|
*/
|
|
|
- return inode_has_perm(cred, inode, open_file_to_av(file), NULL);
|
|
|
+ return inode_has_perm(cred, inode, open_file_to_av(file), NULL, 0);
|
|
|
}
|
|
|
|
|
|
/* task security operations */
|