Skip to content

Commit 0644ec0

Browse files
keestorvalds
authored andcommitted
audit: catch possible NULL audit buffers
It's possible for audit_log_start() to return NULL. Handle it in the various callers. Signed-off-by: Kees Cook <keescook@chromium.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Eric Paris <eparis@redhat.com> Cc: Jeff Layton <jlayton@redhat.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Julien Tinnes <jln@google.com> Cc: Will Drewry <wad@google.com> Cc: Steve Grubb <sgrubb@redhat.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 7b9205b commit 0644ec0

File tree

4 files changed

+27
-11
lines changed

4 files changed

+27
-11
lines changed

kernel/audit.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ static int audit_log_config_change(char *function_name, int new, int old,
272272
int rc = 0;
273273

274274
ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
275+
if (unlikely(!ab))
276+
return rc;
275277
audit_log_format(ab, "%s=%d old=%d auid=%u ses=%u", function_name, new,
276278
old, from_kuid(&init_user_ns, loginuid), sessionid);
277279
if (sid) {
@@ -619,6 +621,8 @@ static int audit_log_common_recv_msg(struct audit_buffer **ab, u16 msg_type,
619621
}
620622

621623
*ab = audit_log_start(NULL, GFP_KERNEL, msg_type);
624+
if (unlikely(!*ab))
625+
return rc;
622626
audit_log_format(*ab, "pid=%d uid=%u auid=%u ses=%u",
623627
task_tgid_vnr(current),
624628
from_kuid(&init_user_ns, current_uid()),

kernel/audit_tree.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -449,26 +449,34 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
449449
return 0;
450450
}
451451

452+
static void audit_log_remove_rule(struct audit_krule *rule)
453+
{
454+
struct audit_buffer *ab;
455+
456+
ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
457+
if (unlikely(!ab))
458+
return;
459+
audit_log_format(ab, "op=");
460+
audit_log_string(ab, "remove rule");
461+
audit_log_format(ab, " dir=");
462+
audit_log_untrustedstring(ab, rule->tree->pathname);
463+
audit_log_key(ab, rule->filterkey);
464+
audit_log_format(ab, " list=%d res=1", rule->listnr);
465+
audit_log_end(ab);
466+
}
467+
452468
static void kill_rules(struct audit_tree *tree)
453469
{
454470
struct audit_krule *rule, *next;
455471
struct audit_entry *entry;
456-
struct audit_buffer *ab;
457472

458473
list_for_each_entry_safe(rule, next, &tree->rules, rlist) {
459474
entry = container_of(rule, struct audit_entry, rule);
460475

461476
list_del_init(&rule->rlist);
462477
if (rule->tree) {
463478
/* not a half-baked one */
464-
ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
465-
audit_log_format(ab, "op=");
466-
audit_log_string(ab, "remove rule");
467-
audit_log_format(ab, " dir=");
468-
audit_log_untrustedstring(ab, rule->tree->pathname);
469-
audit_log_key(ab, rule->filterkey);
470-
audit_log_format(ab, " list=%d res=1", rule->listnr);
471-
audit_log_end(ab);
479+
audit_log_remove_rule(rule);
472480
rule->tree = NULL;
473481
list_del_rcu(&entry->list);
474482
list_del(&entry->rule.list);

kernel/audit_watch.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ static void audit_watch_log_rule_change(struct audit_krule *r, struct audit_watc
240240
if (audit_enabled) {
241241
struct audit_buffer *ab;
242242
ab = audit_log_start(NULL, GFP_NOFS, AUDIT_CONFIG_CHANGE);
243+
if (unlikely(!ab))
244+
return;
243245
audit_log_format(ab, "auid=%u ses=%u op=",
244246
from_kuid(&init_user_ns, audit_get_loginuid(current)),
245247
audit_get_sessionid(current));

kernel/auditsc.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,14 +1464,14 @@ static void show_special(struct audit_context *context, int *call_panic)
14641464
audit_log_end(ab);
14651465
ab = audit_log_start(context, GFP_KERNEL,
14661466
AUDIT_IPC_SET_PERM);
1467+
if (unlikely(!ab))
1468+
return;
14671469
audit_log_format(ab,
14681470
"qbytes=%lx ouid=%u ogid=%u mode=%#ho",
14691471
context->ipc.qbytes,
14701472
context->ipc.perm_uid,
14711473
context->ipc.perm_gid,
14721474
context->ipc.perm_mode);
1473-
if (!ab)
1474-
return;
14751475
}
14761476
break; }
14771477
case AUDIT_MQ_OPEN: {
@@ -2720,6 +2720,8 @@ void audit_core_dumps(long signr)
27202720
return;
27212721

27222722
ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_ANOM_ABEND);
2723+
if (unlikely(!ab))
2724+
return;
27232725
audit_log_abend(ab, "memory violation", signr);
27242726
audit_log_end(ab);
27252727
}

0 commit comments

Comments
 (0)