diff options
Diffstat (limited to 'security/selinux/avc.c')
-rw-r--r-- | security/selinux/avc.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/security/selinux/avc.c b/security/selinux/avc.c index 7f1a304712a9..9da6420e2056 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c | |||
@@ -288,7 +288,6 @@ static struct avc_node *avc_alloc_node(void) | |||
288 | if (!node) | 288 | if (!node) |
289 | goto out; | 289 | goto out; |
290 | 290 | ||
291 | INIT_RCU_HEAD(&node->rhead); | ||
292 | INIT_HLIST_NODE(&node->list); | 291 | INIT_HLIST_NODE(&node->list); |
293 | avc_cache_stats_incr(allocations); | 292 | avc_cache_stats_incr(allocations); |
294 | 293 | ||
@@ -489,9 +488,29 @@ void avc_audit(u32 ssid, u32 tsid, | |||
489 | struct common_audit_data stack_data; | 488 | struct common_audit_data stack_data; |
490 | u32 denied, audited; | 489 | u32 denied, audited; |
491 | denied = requested & ~avd->allowed; | 490 | denied = requested & ~avd->allowed; |
492 | if (denied) | 491 | if (denied) { |
493 | audited = denied & avd->auditdeny; | 492 | audited = denied & avd->auditdeny; |
494 | else if (result) | 493 | /* |
494 | * a->selinux_audit_data.auditdeny is TRICKY! Setting a bit in | ||
495 | * this field means that ANY denials should NOT be audited if | ||
496 | * the policy contains an explicit dontaudit rule for that | ||
497 | * permission. Take notice that this is unrelated to the | ||
498 | * actual permissions that were denied. As an example lets | ||
499 | * assume: | ||
500 | * | ||
501 | * denied == READ | ||
502 | * avd.auditdeny & ACCESS == 0 (not set means explicit rule) | ||
503 | * selinux_audit_data.auditdeny & ACCESS == 1 | ||
504 | * | ||
505 | * We will NOT audit the denial even though the denied | ||
506 | * permission was READ and the auditdeny checks were for | ||
507 | * ACCESS | ||
508 | */ | ||
509 | if (a && | ||
510 | a->selinux_audit_data.auditdeny && | ||
511 | !(a->selinux_audit_data.auditdeny & avd->auditdeny)) | ||
512 | audited = 0; | ||
513 | } else if (result) | ||
495 | audited = denied = requested; | 514 | audited = denied = requested; |
496 | else | 515 | else |
497 | audited = requested & avd->auditallow; | 516 | audited = requested & avd->auditallow; |