|
@@ -449,11 +449,26 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void audit_log_remove_rule(struct audit_krule *rule)
|
|
|
+{
|
|
|
+ struct audit_buffer *ab;
|
|
|
+
|
|
|
+ ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
|
|
|
+ if (unlikely(!ab))
|
|
|
+ return;
|
|
|
+ audit_log_format(ab, "op=");
|
|
|
+ audit_log_string(ab, "remove rule");
|
|
|
+ audit_log_format(ab, " dir=");
|
|
|
+ audit_log_untrustedstring(ab, rule->tree->pathname);
|
|
|
+ audit_log_key(ab, rule->filterkey);
|
|
|
+ audit_log_format(ab, " list=%d res=1", rule->listnr);
|
|
|
+ audit_log_end(ab);
|
|
|
+}
|
|
|
+
|
|
|
static void kill_rules(struct audit_tree *tree)
|
|
|
{
|
|
|
struct audit_krule *rule, *next;
|
|
|
struct audit_entry *entry;
|
|
|
- struct audit_buffer *ab;
|
|
|
|
|
|
list_for_each_entry_safe(rule, next, &tree->rules, rlist) {
|
|
|
entry = container_of(rule, struct audit_entry, rule);
|
|
@@ -461,14 +476,7 @@ static void kill_rules(struct audit_tree *tree)
|
|
|
list_del_init(&rule->rlist);
|
|
|
if (rule->tree) {
|
|
|
/* not a half-baked one */
|
|
|
- ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
|
|
|
- audit_log_format(ab, "op=");
|
|
|
- audit_log_string(ab, "remove rule");
|
|
|
- audit_log_format(ab, " dir=");
|
|
|
- audit_log_untrustedstring(ab, rule->tree->pathname);
|
|
|
- audit_log_key(ab, rule->filterkey);
|
|
|
- audit_log_format(ab, " list=%d res=1", rule->listnr);
|
|
|
- audit_log_end(ab);
|
|
|
+ audit_log_remove_rule(rule);
|
|
|
rule->tree = NULL;
|
|
|
list_del_rcu(&entry->list);
|
|
|
list_del(&entry->rule.list);
|