diff options
Diffstat (limited to 'security')
| -rw-r--r-- | security/selinux/avc.c | 27 | ||||
| -rw-r--r-- | security/selinux/include/avc.h | 14 |
2 files changed, 27 insertions, 14 deletions
diff --git a/security/selinux/avc.c b/security/selinux/avc.c index b5545a84448a..36c42bb52d81 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c | |||
| @@ -436,9 +436,9 @@ static void avc_audit_pre_callback(struct audit_buffer *ab, void *a) | |||
| 436 | { | 436 | { |
| 437 | struct common_audit_data *ad = a; | 437 | struct common_audit_data *ad = a; |
| 438 | audit_log_format(ab, "avc: %s ", | 438 | audit_log_format(ab, "avc: %s ", |
| 439 | ad->selinux_audit_data->denied ? "denied" : "granted"); | 439 | ad->selinux_audit_data->slad->denied ? "denied" : "granted"); |
| 440 | avc_dump_av(ab, ad->selinux_audit_data->tclass, | 440 | avc_dump_av(ab, ad->selinux_audit_data->slad->tclass, |
| 441 | ad->selinux_audit_data->audited); | 441 | ad->selinux_audit_data->slad->audited); |
| 442 | audit_log_format(ab, " for "); | 442 | audit_log_format(ab, " for "); |
| 443 | } | 443 | } |
| 444 | 444 | ||
| @@ -452,9 +452,9 @@ static void avc_audit_post_callback(struct audit_buffer *ab, void *a) | |||
| 452 | { | 452 | { |
| 453 | struct common_audit_data *ad = a; | 453 | struct common_audit_data *ad = a; |
| 454 | audit_log_format(ab, " "); | 454 | audit_log_format(ab, " "); |
| 455 | avc_dump_query(ab, ad->selinux_audit_data->ssid, | 455 | avc_dump_query(ab, ad->selinux_audit_data->slad->ssid, |
| 456 | ad->selinux_audit_data->tsid, | 456 | ad->selinux_audit_data->slad->tsid, |
| 457 | ad->selinux_audit_data->tclass); | 457 | ad->selinux_audit_data->slad->tclass); |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | /* This is the slow part of avc audit with big stack footprint */ | 460 | /* This is the slow part of avc audit with big stack footprint */ |
| @@ -465,6 +465,7 @@ static noinline int slow_avc_audit(u32 ssid, u32 tsid, u16 tclass, | |||
| 465 | { | 465 | { |
| 466 | struct common_audit_data stack_data; | 466 | struct common_audit_data stack_data; |
| 467 | struct selinux_audit_data sad = {0,}; | 467 | struct selinux_audit_data sad = {0,}; |
| 468 | struct selinux_late_audit_data slad; | ||
| 468 | 469 | ||
| 469 | if (!a) { | 470 | if (!a) { |
| 470 | a = &stack_data; | 471 | a = &stack_data; |
| @@ -483,12 +484,14 @@ static noinline int slow_avc_audit(u32 ssid, u32 tsid, u16 tclass, | |||
| 483 | (flags & MAY_NOT_BLOCK)) | 484 | (flags & MAY_NOT_BLOCK)) |
| 484 | return -ECHILD; | 485 | return -ECHILD; |
| 485 | 486 | ||
| 486 | a->selinux_audit_data->tclass = tclass; | 487 | slad.tclass = tclass; |
| 487 | a->selinux_audit_data->requested = requested; | 488 | slad.requested = requested; |
| 488 | a->selinux_audit_data->ssid = ssid; | 489 | slad.ssid = ssid; |
| 489 | a->selinux_audit_data->tsid = tsid; | 490 | slad.tsid = tsid; |
| 490 | a->selinux_audit_data->audited = audited; | 491 | slad.audited = audited; |
| 491 | a->selinux_audit_data->denied = denied; | 492 | slad.denied = denied; |
| 493 | |||
| 494 | a->selinux_audit_data->slad = &slad; | ||
| 492 | a->lsm_pre_audit = avc_audit_pre_callback; | 495 | a->lsm_pre_audit = avc_audit_pre_callback; |
| 493 | a->lsm_post_audit = avc_audit_post_callback; | 496 | a->lsm_post_audit = avc_audit_post_callback; |
| 494 | common_lsm_audit(a); | 497 | common_lsm_audit(a); |
diff --git a/security/selinux/include/avc.h b/security/selinux/include/avc.h index 09c3eda12128..1931370233d7 100644 --- a/security/selinux/include/avc.h +++ b/security/selinux/include/avc.h | |||
| @@ -46,19 +46,29 @@ struct avc_cache_stats { | |||
| 46 | unsigned int frees; | 46 | unsigned int frees; |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | struct selinux_audit_data { | 49 | /* |
| 50 | * We only need this data after we have decided to send an audit message. | ||
| 51 | */ | ||
| 52 | struct selinux_late_audit_data { | ||
| 50 | u32 ssid; | 53 | u32 ssid; |
| 51 | u32 tsid; | 54 | u32 tsid; |
| 52 | u16 tclass; | 55 | u16 tclass; |
| 53 | u32 requested; | 56 | u32 requested; |
| 54 | u32 audited; | 57 | u32 audited; |
| 55 | u32 denied; | 58 | u32 denied; |
| 59 | int result; | ||
| 60 | }; | ||
| 61 | |||
| 62 | /* | ||
| 63 | * We collect this at the beginning or during an selinux security operation | ||
| 64 | */ | ||
| 65 | struct selinux_audit_data { | ||
| 56 | /* | 66 | /* |
| 57 | * auditdeny is a bit tricky and unintuitive. See the | 67 | * auditdeny is a bit tricky and unintuitive. See the |
| 58 | * comments in avc.c for it's meaning and usage. | 68 | * comments in avc.c for it's meaning and usage. |
| 59 | */ | 69 | */ |
| 60 | u32 auditdeny; | 70 | u32 auditdeny; |
| 61 | int result; | 71 | struct selinux_late_audit_data *slad; |
| 62 | }; | 72 | }; |
| 63 | 73 | ||
| 64 | /* | 74 | /* |
