diff options
Diffstat (limited to 'kernel/auditsc.c')
-rw-r--r-- | kernel/auditsc.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 56e56ed594a8..c10e7aae04d7 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -68,9 +68,6 @@ | |||
68 | 68 | ||
69 | #include "audit.h" | 69 | #include "audit.h" |
70 | 70 | ||
71 | extern struct list_head audit_filter_list[]; | ||
72 | extern int audit_ever_enabled; | ||
73 | |||
74 | /* AUDIT_NAMES is the number of slots we reserve in the audit_context | 71 | /* AUDIT_NAMES is the number of slots we reserve in the audit_context |
75 | * for saving names from getname(). */ | 72 | * for saving names from getname(). */ |
76 | #define AUDIT_NAMES 20 | 73 | #define AUDIT_NAMES 20 |
@@ -283,6 +280,19 @@ static int audit_match_perm(struct audit_context *ctx, int mask) | |||
283 | } | 280 | } |
284 | } | 281 | } |
285 | 282 | ||
283 | static int audit_match_filetype(struct audit_context *ctx, int which) | ||
284 | { | ||
285 | unsigned index = which & ~S_IFMT; | ||
286 | mode_t mode = which & S_IFMT; | ||
287 | if (index >= ctx->name_count) | ||
288 | return 0; | ||
289 | if (ctx->names[index].ino == -1) | ||
290 | return 0; | ||
291 | if ((ctx->names[index].mode ^ mode) & S_IFMT) | ||
292 | return 0; | ||
293 | return 1; | ||
294 | } | ||
295 | |||
286 | /* | 296 | /* |
287 | * We keep a linked list of fixed-sized (31 pointer) arrays of audit_chunk *; | 297 | * We keep a linked list of fixed-sized (31 pointer) arrays of audit_chunk *; |
288 | * ->first_trees points to its beginning, ->trees - to the current end of data. | 298 | * ->first_trees points to its beginning, ->trees - to the current end of data. |
@@ -592,6 +602,9 @@ static int audit_filter_rules(struct task_struct *tsk, | |||
592 | case AUDIT_PERM: | 602 | case AUDIT_PERM: |
593 | result = audit_match_perm(ctx, f->val); | 603 | result = audit_match_perm(ctx, f->val); |
594 | break; | 604 | break; |
605 | case AUDIT_FILETYPE: | ||
606 | result = audit_match_filetype(ctx, f->val); | ||
607 | break; | ||
595 | } | 608 | } |
596 | 609 | ||
597 | if (!result) | 610 | if (!result) |
@@ -1095,7 +1108,7 @@ static int audit_log_single_execve_arg(struct audit_context *context, | |||
1095 | audit_log_format(*ab, "[%d]", i); | 1108 | audit_log_format(*ab, "[%d]", i); |
1096 | audit_log_format(*ab, "="); | 1109 | audit_log_format(*ab, "="); |
1097 | if (has_cntl) | 1110 | if (has_cntl) |
1098 | audit_log_hex(*ab, buf, to_send); | 1111 | audit_log_n_hex(*ab, buf, to_send); |
1099 | else | 1112 | else |
1100 | audit_log_format(*ab, "\"%s\"", buf); | 1113 | audit_log_format(*ab, "\"%s\"", buf); |
1101 | audit_log_format(*ab, "\n"); | 1114 | audit_log_format(*ab, "\n"); |
@@ -1296,7 +1309,6 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
1296 | break; } | 1309 | break; } |
1297 | 1310 | ||
1298 | case AUDIT_SOCKETCALL: { | 1311 | case AUDIT_SOCKETCALL: { |
1299 | int i; | ||
1300 | struct audit_aux_data_socketcall *axs = (void *)aux; | 1312 | struct audit_aux_data_socketcall *axs = (void *)aux; |
1301 | audit_log_format(ab, "nargs=%d", axs->nargs); | 1313 | audit_log_format(ab, "nargs=%d", axs->nargs); |
1302 | for (i=0; i<axs->nargs; i++) | 1314 | for (i=0; i<axs->nargs; i++) |
@@ -1307,7 +1319,7 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
1307 | struct audit_aux_data_sockaddr *axs = (void *)aux; | 1319 | struct audit_aux_data_sockaddr *axs = (void *)aux; |
1308 | 1320 | ||
1309 | audit_log_format(ab, "saddr="); | 1321 | audit_log_format(ab, "saddr="); |
1310 | audit_log_hex(ab, axs->a, axs->len); | 1322 | audit_log_n_hex(ab, axs->a, axs->len); |
1311 | break; } | 1323 | break; } |
1312 | 1324 | ||
1313 | case AUDIT_FD_PAIR: { | 1325 | case AUDIT_FD_PAIR: { |
@@ -1321,7 +1333,6 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
1321 | 1333 | ||
1322 | for (aux = context->aux_pids; aux; aux = aux->next) { | 1334 | for (aux = context->aux_pids; aux; aux = aux->next) { |
1323 | struct audit_aux_data_pids *axs = (void *)aux; | 1335 | struct audit_aux_data_pids *axs = (void *)aux; |
1324 | int i; | ||
1325 | 1336 | ||
1326 | for (i = 0; i < axs->pid_count; i++) | 1337 | for (i = 0; i < axs->pid_count; i++) |
1327 | if (audit_log_pid_context(context, axs->target_pid[i], | 1338 | if (audit_log_pid_context(context, axs->target_pid[i], |
@@ -1371,8 +1382,8 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
1371 | default: | 1382 | default: |
1372 | /* log the name's directory component */ | 1383 | /* log the name's directory component */ |
1373 | audit_log_format(ab, " name="); | 1384 | audit_log_format(ab, " name="); |
1374 | audit_log_n_untrustedstring(ab, n->name_len, | 1385 | audit_log_n_untrustedstring(ab, n->name, |
1375 | n->name); | 1386 | n->name_len); |
1376 | } | 1387 | } |
1377 | } else | 1388 | } else |
1378 | audit_log_format(ab, " name=(null)"); | 1389 | audit_log_format(ab, " name=(null)"); |
@@ -1596,7 +1607,7 @@ static inline void handle_one(const struct inode *inode) | |||
1596 | if (likely(put_tree_ref(context, chunk))) | 1607 | if (likely(put_tree_ref(context, chunk))) |
1597 | return; | 1608 | return; |
1598 | if (unlikely(!grow_tree_refs(context))) { | 1609 | if (unlikely(!grow_tree_refs(context))) { |
1599 | printk(KERN_WARNING "out of memory, audit has lost a tree reference"); | 1610 | printk(KERN_WARNING "out of memory, audit has lost a tree reference\n"); |
1600 | audit_set_auditable(context); | 1611 | audit_set_auditable(context); |
1601 | audit_put_chunk(chunk); | 1612 | audit_put_chunk(chunk); |
1602 | unroll_tree_refs(context, p, count); | 1613 | unroll_tree_refs(context, p, count); |
@@ -1656,7 +1667,7 @@ retry: | |||
1656 | } | 1667 | } |
1657 | /* too bad */ | 1668 | /* too bad */ |
1658 | printk(KERN_WARNING | 1669 | printk(KERN_WARNING |
1659 | "out of memory, audit has lost a tree reference"); | 1670 | "out of memory, audit has lost a tree reference\n"); |
1660 | unroll_tree_refs(context, p, count); | 1671 | unroll_tree_refs(context, p, count); |
1661 | audit_set_auditable(context); | 1672 | audit_set_auditable(context); |
1662 | return; | 1673 | return; |
@@ -1752,13 +1763,13 @@ static int audit_inc_name_count(struct audit_context *context, | |||
1752 | if (context->name_count >= AUDIT_NAMES) { | 1763 | if (context->name_count >= AUDIT_NAMES) { |
1753 | if (inode) | 1764 | if (inode) |
1754 | printk(KERN_DEBUG "name_count maxed, losing inode data: " | 1765 | printk(KERN_DEBUG "name_count maxed, losing inode data: " |
1755 | "dev=%02x:%02x, inode=%lu", | 1766 | "dev=%02x:%02x, inode=%lu\n", |
1756 | MAJOR(inode->i_sb->s_dev), | 1767 | MAJOR(inode->i_sb->s_dev), |
1757 | MINOR(inode->i_sb->s_dev), | 1768 | MINOR(inode->i_sb->s_dev), |
1758 | inode->i_ino); | 1769 | inode->i_ino); |
1759 | 1770 | ||
1760 | else | 1771 | else |
1761 | printk(KERN_DEBUG "name_count maxed, losing inode data"); | 1772 | printk(KERN_DEBUG "name_count maxed, losing inode data\n"); |
1762 | return 1; | 1773 | return 1; |
1763 | } | 1774 | } |
1764 | context->name_count++; | 1775 | context->name_count++; |
@@ -2361,9 +2372,6 @@ int __audit_signal_info(int sig, struct task_struct *t) | |||
2361 | struct audit_aux_data_pids *axp; | 2372 | struct audit_aux_data_pids *axp; |
2362 | struct task_struct *tsk = current; | 2373 | struct task_struct *tsk = current; |
2363 | struct audit_context *ctx = tsk->audit_context; | 2374 | struct audit_context *ctx = tsk->audit_context; |
2364 | extern pid_t audit_sig_pid; | ||
2365 | extern uid_t audit_sig_uid; | ||
2366 | extern u32 audit_sig_sid; | ||
2367 | 2375 | ||
2368 | if (audit_pid && t->tgid == audit_pid) { | 2376 | if (audit_pid && t->tgid == audit_pid) { |
2369 | if (sig == SIGTERM || sig == SIGHUP || sig == SIGUSR1) { | 2377 | if (sig == SIGTERM || sig == SIGHUP || sig == SIGUSR1) { |