From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751883AbcFAWvF (ORCPT ); Wed, 1 Jun 2016 18:51:05 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45153 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751795AbcFAWvD (ORCPT ); Wed, 1 Jun 2016 18:51:03 -0400 From: Richard Guy Briggs To: linux-audit@redhat.com, linux-kernel@vger.kernel.org Cc: Richard Guy Briggs , sgrubb@redhat.com, pmoore@redhat.com, eparis@redhat.com Subject: [PATCH] audit: add fields to exclude filter by reusing user filter Date: Wed, 1 Jun 2016 18:50:26 -0400 Message-Id: <3ff3a1c2837c8045bb54058effd11edd897b6412.1464810610.git.rgb@redhat.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 01 Jun 2016 22:51:02 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RFE: add additional fields for use in audit filter exclude rules https://github.com/linux-audit/audit-kernel/issues/5 Re-factor audit_filter_type() to use audit_filter_user_rules() to enable exclude filter to additionally filter on PID, UID, GID, AUID, LOGINUID_SET, SUBJ_*. Add check in audit_filter_user() to quit early if list is empty. Signed-off-by: Richard Guy Briggs --- kernel/auditfilter.c | 22 +++++++++------------- 1 files changed, 9 insertions(+), 13 deletions(-) diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c index 96c9a1b..515c752 100644 --- a/kernel/auditfilter.c +++ b/kernel/auditfilter.c @@ -1358,6 +1358,9 @@ int audit_filter_user(int type) ret = 1; /* Audit by default */ rcu_read_lock(); + if (list_empty(&audit_filter_list[AUDIT_FILTER_USER])) + goto unlock_and_return; + list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_USER], list) { rc = audit_filter_user_rules(&e->rule, type, &state); if (rc) { @@ -1366,13 +1369,14 @@ int audit_filter_user(int type) break; } } +unlock_and_return: rcu_read_unlock(); - return ret; } int audit_filter_type(int type) { + enum audit_state state = AUDIT_DISABLED; struct audit_entry *e; int result = 0; @@ -1380,19 +1384,11 @@ int audit_filter_type(int type) if (list_empty(&audit_filter_list[AUDIT_FILTER_TYPE])) goto unlock_and_return; - list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_TYPE], - list) { - int i; - for (i = 0; i < e->rule.field_count; i++) { - struct audit_field *f = &e->rule.fields[i]; - if (f->type == AUDIT_MSGTYPE) { - result = audit_comparator(type, f->op, f->val); - if (!result) - break; - } + list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_TYPE], list) { + if (audit_filter_user_rules(&e->rule, type, &state) == 1) { + result = 1; + break; } - if (result) - goto unlock_and_return; } unlock_and_return: rcu_read_unlock(); -- 1.7.1