cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

auditfilter.c (35209B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* auditfilter.c -- filtering of audit events
      3 *
      4 * Copyright 2003-2004 Red Hat, Inc.
      5 * Copyright 2005 Hewlett-Packard Development Company, L.P.
      6 * Copyright 2005 IBM Corporation
      7 */
      8
      9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     10
     11#include <linux/kernel.h>
     12#include <linux/audit.h>
     13#include <linux/kthread.h>
     14#include <linux/mutex.h>
     15#include <linux/fs.h>
     16#include <linux/namei.h>
     17#include <linux/netlink.h>
     18#include <linux/sched.h>
     19#include <linux/slab.h>
     20#include <linux/security.h>
     21#include <net/net_namespace.h>
     22#include <net/sock.h>
     23#include "audit.h"
     24
     25/*
     26 * Locking model:
     27 *
     28 * audit_filter_mutex:
     29 *		Synchronizes writes and blocking reads of audit's filterlist
     30 *		data.  Rcu is used to traverse the filterlist and access
     31 *		contents of structs audit_entry, audit_watch and opaque
     32 *		LSM rules during filtering.  If modified, these structures
     33 *		must be copied and replace their counterparts in the filterlist.
     34 *		An audit_parent struct is not accessed during filtering, so may
     35 *		be written directly provided audit_filter_mutex is held.
     36 */
     37
     38/* Audit filter lists, defined in <linux/audit.h> */
     39struct list_head audit_filter_list[AUDIT_NR_FILTERS] = {
     40	LIST_HEAD_INIT(audit_filter_list[0]),
     41	LIST_HEAD_INIT(audit_filter_list[1]),
     42	LIST_HEAD_INIT(audit_filter_list[2]),
     43	LIST_HEAD_INIT(audit_filter_list[3]),
     44	LIST_HEAD_INIT(audit_filter_list[4]),
     45	LIST_HEAD_INIT(audit_filter_list[5]),
     46	LIST_HEAD_INIT(audit_filter_list[6]),
     47	LIST_HEAD_INIT(audit_filter_list[7]),
     48#if AUDIT_NR_FILTERS != 8
     49#error Fix audit_filter_list initialiser
     50#endif
     51};
     52static struct list_head audit_rules_list[AUDIT_NR_FILTERS] = {
     53	LIST_HEAD_INIT(audit_rules_list[0]),
     54	LIST_HEAD_INIT(audit_rules_list[1]),
     55	LIST_HEAD_INIT(audit_rules_list[2]),
     56	LIST_HEAD_INIT(audit_rules_list[3]),
     57	LIST_HEAD_INIT(audit_rules_list[4]),
     58	LIST_HEAD_INIT(audit_rules_list[5]),
     59	LIST_HEAD_INIT(audit_rules_list[6]),
     60	LIST_HEAD_INIT(audit_rules_list[7]),
     61};
     62
     63DEFINE_MUTEX(audit_filter_mutex);
     64
     65static void audit_free_lsm_field(struct audit_field *f)
     66{
     67	switch (f->type) {
     68	case AUDIT_SUBJ_USER:
     69	case AUDIT_SUBJ_ROLE:
     70	case AUDIT_SUBJ_TYPE:
     71	case AUDIT_SUBJ_SEN:
     72	case AUDIT_SUBJ_CLR:
     73	case AUDIT_OBJ_USER:
     74	case AUDIT_OBJ_ROLE:
     75	case AUDIT_OBJ_TYPE:
     76	case AUDIT_OBJ_LEV_LOW:
     77	case AUDIT_OBJ_LEV_HIGH:
     78		kfree(f->lsm_str);
     79		security_audit_rule_free(f->lsm_rule);
     80	}
     81}
     82
     83static inline void audit_free_rule(struct audit_entry *e)
     84{
     85	int i;
     86	struct audit_krule *erule = &e->rule;
     87
     88	/* some rules don't have associated watches */
     89	if (erule->watch)
     90		audit_put_watch(erule->watch);
     91	if (erule->fields)
     92		for (i = 0; i < erule->field_count; i++)
     93			audit_free_lsm_field(&erule->fields[i]);
     94	kfree(erule->fields);
     95	kfree(erule->filterkey);
     96	kfree(e);
     97}
     98
     99void audit_free_rule_rcu(struct rcu_head *head)
    100{
    101	struct audit_entry *e = container_of(head, struct audit_entry, rcu);
    102	audit_free_rule(e);
    103}
    104
    105/* Initialize an audit filterlist entry. */
    106static inline struct audit_entry *audit_init_entry(u32 field_count)
    107{
    108	struct audit_entry *entry;
    109	struct audit_field *fields;
    110
    111	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
    112	if (unlikely(!entry))
    113		return NULL;
    114
    115	fields = kcalloc(field_count, sizeof(*fields), GFP_KERNEL);
    116	if (unlikely(!fields)) {
    117		kfree(entry);
    118		return NULL;
    119	}
    120	entry->rule.fields = fields;
    121
    122	return entry;
    123}
    124
    125/* Unpack a filter field's string representation from user-space
    126 * buffer. */
    127char *audit_unpack_string(void **bufp, size_t *remain, size_t len)
    128{
    129	char *str;
    130
    131	if (!*bufp || (len == 0) || (len > *remain))
    132		return ERR_PTR(-EINVAL);
    133
    134	/* Of the currently implemented string fields, PATH_MAX
    135	 * defines the longest valid length.
    136	 */
    137	if (len > PATH_MAX)
    138		return ERR_PTR(-ENAMETOOLONG);
    139
    140	str = kmalloc(len + 1, GFP_KERNEL);
    141	if (unlikely(!str))
    142		return ERR_PTR(-ENOMEM);
    143
    144	memcpy(str, *bufp, len);
    145	str[len] = 0;
    146	*bufp += len;
    147	*remain -= len;
    148
    149	return str;
    150}
    151
    152/* Translate an inode field to kernel representation. */
    153static inline int audit_to_inode(struct audit_krule *krule,
    154				 struct audit_field *f)
    155{
    156	if ((krule->listnr != AUDIT_FILTER_EXIT &&
    157	     krule->listnr != AUDIT_FILTER_URING_EXIT) ||
    158	    krule->inode_f || krule->watch || krule->tree ||
    159	    (f->op != Audit_equal && f->op != Audit_not_equal))
    160		return -EINVAL;
    161
    162	krule->inode_f = f;
    163	return 0;
    164}
    165
    166static __u32 *classes[AUDIT_SYSCALL_CLASSES];
    167
    168int __init audit_register_class(int class, unsigned *list)
    169{
    170	__u32 *p = kcalloc(AUDIT_BITMASK_SIZE, sizeof(__u32), GFP_KERNEL);
    171	if (!p)
    172		return -ENOMEM;
    173	while (*list != ~0U) {
    174		unsigned n = *list++;
    175		if (n >= AUDIT_BITMASK_SIZE * 32 - AUDIT_SYSCALL_CLASSES) {
    176			kfree(p);
    177			return -EINVAL;
    178		}
    179		p[AUDIT_WORD(n)] |= AUDIT_BIT(n);
    180	}
    181	if (class >= AUDIT_SYSCALL_CLASSES || classes[class]) {
    182		kfree(p);
    183		return -EINVAL;
    184	}
    185	classes[class] = p;
    186	return 0;
    187}
    188
    189int audit_match_class(int class, unsigned syscall)
    190{
    191	if (unlikely(syscall >= AUDIT_BITMASK_SIZE * 32))
    192		return 0;
    193	if (unlikely(class >= AUDIT_SYSCALL_CLASSES || !classes[class]))
    194		return 0;
    195	return classes[class][AUDIT_WORD(syscall)] & AUDIT_BIT(syscall);
    196}
    197
    198#ifdef CONFIG_AUDITSYSCALL
    199static inline int audit_match_class_bits(int class, u32 *mask)
    200{
    201	int i;
    202
    203	if (classes[class]) {
    204		for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
    205			if (mask[i] & classes[class][i])
    206				return 0;
    207	}
    208	return 1;
    209}
    210
    211static int audit_match_signal(struct audit_entry *entry)
    212{
    213	struct audit_field *arch = entry->rule.arch_f;
    214
    215	if (!arch) {
    216		/* When arch is unspecified, we must check both masks on biarch
    217		 * as syscall number alone is ambiguous. */
    218		return (audit_match_class_bits(AUDIT_CLASS_SIGNAL,
    219					       entry->rule.mask) &&
    220			audit_match_class_bits(AUDIT_CLASS_SIGNAL_32,
    221					       entry->rule.mask));
    222	}
    223
    224	switch(audit_classify_arch(arch->val)) {
    225	case 0: /* native */
    226		return (audit_match_class_bits(AUDIT_CLASS_SIGNAL,
    227					       entry->rule.mask));
    228	case 1: /* 32bit on biarch */
    229		return (audit_match_class_bits(AUDIT_CLASS_SIGNAL_32,
    230					       entry->rule.mask));
    231	default:
    232		return 1;
    233	}
    234}
    235#endif
    236
    237/* Common user-space to kernel rule translation. */
    238static inline struct audit_entry *audit_to_entry_common(struct audit_rule_data *rule)
    239{
    240	unsigned listnr;
    241	struct audit_entry *entry;
    242	int i, err;
    243
    244	err = -EINVAL;
    245	listnr = rule->flags & ~AUDIT_FILTER_PREPEND;
    246	switch(listnr) {
    247	default:
    248		goto exit_err;
    249#ifdef CONFIG_AUDITSYSCALL
    250	case AUDIT_FILTER_ENTRY:
    251		pr_err("AUDIT_FILTER_ENTRY is deprecated\n");
    252		goto exit_err;
    253	case AUDIT_FILTER_EXIT:
    254	case AUDIT_FILTER_URING_EXIT:
    255	case AUDIT_FILTER_TASK:
    256#endif
    257	case AUDIT_FILTER_USER:
    258	case AUDIT_FILTER_EXCLUDE:
    259	case AUDIT_FILTER_FS:
    260		;
    261	}
    262	if (unlikely(rule->action == AUDIT_POSSIBLE)) {
    263		pr_err("AUDIT_POSSIBLE is deprecated\n");
    264		goto exit_err;
    265	}
    266	if (rule->action != AUDIT_NEVER && rule->action != AUDIT_ALWAYS)
    267		goto exit_err;
    268	if (rule->field_count > AUDIT_MAX_FIELDS)
    269		goto exit_err;
    270
    271	err = -ENOMEM;
    272	entry = audit_init_entry(rule->field_count);
    273	if (!entry)
    274		goto exit_err;
    275
    276	entry->rule.flags = rule->flags & AUDIT_FILTER_PREPEND;
    277	entry->rule.listnr = listnr;
    278	entry->rule.action = rule->action;
    279	entry->rule.field_count = rule->field_count;
    280
    281	for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
    282		entry->rule.mask[i] = rule->mask[i];
    283
    284	for (i = 0; i < AUDIT_SYSCALL_CLASSES; i++) {
    285		int bit = AUDIT_BITMASK_SIZE * 32 - i - 1;
    286		__u32 *p = &entry->rule.mask[AUDIT_WORD(bit)];
    287		__u32 *class;
    288
    289		if (!(*p & AUDIT_BIT(bit)))
    290			continue;
    291		*p &= ~AUDIT_BIT(bit);
    292		class = classes[i];
    293		if (class) {
    294			int j;
    295			for (j = 0; j < AUDIT_BITMASK_SIZE; j++)
    296				entry->rule.mask[j] |= class[j];
    297		}
    298	}
    299
    300	return entry;
    301
    302exit_err:
    303	return ERR_PTR(err);
    304}
    305
    306static u32 audit_ops[] =
    307{
    308	[Audit_equal] = AUDIT_EQUAL,
    309	[Audit_not_equal] = AUDIT_NOT_EQUAL,
    310	[Audit_bitmask] = AUDIT_BIT_MASK,
    311	[Audit_bittest] = AUDIT_BIT_TEST,
    312	[Audit_lt] = AUDIT_LESS_THAN,
    313	[Audit_gt] = AUDIT_GREATER_THAN,
    314	[Audit_le] = AUDIT_LESS_THAN_OR_EQUAL,
    315	[Audit_ge] = AUDIT_GREATER_THAN_OR_EQUAL,
    316};
    317
    318static u32 audit_to_op(u32 op)
    319{
    320	u32 n;
    321	for (n = Audit_equal; n < Audit_bad && audit_ops[n] != op; n++)
    322		;
    323	return n;
    324}
    325
    326/* check if an audit field is valid */
    327static int audit_field_valid(struct audit_entry *entry, struct audit_field *f)
    328{
    329	switch (f->type) {
    330	case AUDIT_MSGTYPE:
    331		if (entry->rule.listnr != AUDIT_FILTER_EXCLUDE &&
    332		    entry->rule.listnr != AUDIT_FILTER_USER)
    333			return -EINVAL;
    334		break;
    335	case AUDIT_FSTYPE:
    336		if (entry->rule.listnr != AUDIT_FILTER_FS)
    337			return -EINVAL;
    338		break;
    339	case AUDIT_PERM:
    340		if (entry->rule.listnr == AUDIT_FILTER_URING_EXIT)
    341			return -EINVAL;
    342		break;
    343	}
    344
    345	switch (entry->rule.listnr) {
    346	case AUDIT_FILTER_FS:
    347		switch(f->type) {
    348		case AUDIT_FSTYPE:
    349		case AUDIT_FILTERKEY:
    350			break;
    351		default:
    352			return -EINVAL;
    353		}
    354	}
    355
    356	/* Check for valid field type and op */
    357	switch (f->type) {
    358	case AUDIT_ARG0:
    359	case AUDIT_ARG1:
    360	case AUDIT_ARG2:
    361	case AUDIT_ARG3:
    362	case AUDIT_PERS: /* <uapi/linux/personality.h> */
    363	case AUDIT_DEVMINOR:
    364		/* all ops are valid */
    365		break;
    366	case AUDIT_UID:
    367	case AUDIT_EUID:
    368	case AUDIT_SUID:
    369	case AUDIT_FSUID:
    370	case AUDIT_LOGINUID:
    371	case AUDIT_OBJ_UID:
    372	case AUDIT_GID:
    373	case AUDIT_EGID:
    374	case AUDIT_SGID:
    375	case AUDIT_FSGID:
    376	case AUDIT_OBJ_GID:
    377	case AUDIT_PID:
    378	case AUDIT_MSGTYPE:
    379	case AUDIT_PPID:
    380	case AUDIT_DEVMAJOR:
    381	case AUDIT_EXIT:
    382	case AUDIT_SUCCESS:
    383	case AUDIT_INODE:
    384	case AUDIT_SESSIONID:
    385	case AUDIT_SUBJ_SEN:
    386	case AUDIT_SUBJ_CLR:
    387	case AUDIT_OBJ_LEV_LOW:
    388	case AUDIT_OBJ_LEV_HIGH:
    389	case AUDIT_SADDR_FAM:
    390		/* bit ops are only useful on syscall args */
    391		if (f->op == Audit_bitmask || f->op == Audit_bittest)
    392			return -EINVAL;
    393		break;
    394	case AUDIT_SUBJ_USER:
    395	case AUDIT_SUBJ_ROLE:
    396	case AUDIT_SUBJ_TYPE:
    397	case AUDIT_OBJ_USER:
    398	case AUDIT_OBJ_ROLE:
    399	case AUDIT_OBJ_TYPE:
    400	case AUDIT_WATCH:
    401	case AUDIT_DIR:
    402	case AUDIT_FILTERKEY:
    403	case AUDIT_LOGINUID_SET:
    404	case AUDIT_ARCH:
    405	case AUDIT_FSTYPE:
    406	case AUDIT_PERM:
    407	case AUDIT_FILETYPE:
    408	case AUDIT_FIELD_COMPARE:
    409	case AUDIT_EXE:
    410		/* only equal and not equal valid ops */
    411		if (f->op != Audit_not_equal && f->op != Audit_equal)
    412			return -EINVAL;
    413		break;
    414	default:
    415		/* field not recognized */
    416		return -EINVAL;
    417	}
    418
    419	/* Check for select valid field values */
    420	switch (f->type) {
    421	case AUDIT_LOGINUID_SET:
    422		if ((f->val != 0) && (f->val != 1))
    423			return -EINVAL;
    424		break;
    425	case AUDIT_PERM:
    426		if (f->val & ~15)
    427			return -EINVAL;
    428		break;
    429	case AUDIT_FILETYPE:
    430		if (f->val & ~S_IFMT)
    431			return -EINVAL;
    432		break;
    433	case AUDIT_FIELD_COMPARE:
    434		if (f->val > AUDIT_MAX_FIELD_COMPARE)
    435			return -EINVAL;
    436		break;
    437	case AUDIT_SADDR_FAM:
    438		if (f->val >= AF_MAX)
    439			return -EINVAL;
    440		break;
    441	default:
    442		break;
    443	}
    444
    445	return 0;
    446}
    447
    448/* Translate struct audit_rule_data to kernel's rule representation. */
    449static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,
    450					       size_t datasz)
    451{
    452	int err = 0;
    453	struct audit_entry *entry;
    454	void *bufp;
    455	size_t remain = datasz - sizeof(struct audit_rule_data);
    456	int i;
    457	char *str;
    458	struct audit_fsnotify_mark *audit_mark;
    459
    460	entry = audit_to_entry_common(data);
    461	if (IS_ERR(entry))
    462		goto exit_nofree;
    463
    464	bufp = data->buf;
    465	for (i = 0; i < data->field_count; i++) {
    466		struct audit_field *f = &entry->rule.fields[i];
    467		u32 f_val;
    468
    469		err = -EINVAL;
    470
    471		f->op = audit_to_op(data->fieldflags[i]);
    472		if (f->op == Audit_bad)
    473			goto exit_free;
    474
    475		f->type = data->fields[i];
    476		f_val = data->values[i];
    477
    478		/* Support legacy tests for a valid loginuid */
    479		if ((f->type == AUDIT_LOGINUID) && (f_val == AUDIT_UID_UNSET)) {
    480			f->type = AUDIT_LOGINUID_SET;
    481			f_val = 0;
    482			entry->rule.pflags |= AUDIT_LOGINUID_LEGACY;
    483		}
    484
    485		err = audit_field_valid(entry, f);
    486		if (err)
    487			goto exit_free;
    488
    489		err = -EINVAL;
    490		switch (f->type) {
    491		case AUDIT_LOGINUID:
    492		case AUDIT_UID:
    493		case AUDIT_EUID:
    494		case AUDIT_SUID:
    495		case AUDIT_FSUID:
    496		case AUDIT_OBJ_UID:
    497			f->uid = make_kuid(current_user_ns(), f_val);
    498			if (!uid_valid(f->uid))
    499				goto exit_free;
    500			break;
    501		case AUDIT_GID:
    502		case AUDIT_EGID:
    503		case AUDIT_SGID:
    504		case AUDIT_FSGID:
    505		case AUDIT_OBJ_GID:
    506			f->gid = make_kgid(current_user_ns(), f_val);
    507			if (!gid_valid(f->gid))
    508				goto exit_free;
    509			break;
    510		case AUDIT_ARCH:
    511			f->val = f_val;
    512			entry->rule.arch_f = f;
    513			break;
    514		case AUDIT_SUBJ_USER:
    515		case AUDIT_SUBJ_ROLE:
    516		case AUDIT_SUBJ_TYPE:
    517		case AUDIT_SUBJ_SEN:
    518		case AUDIT_SUBJ_CLR:
    519		case AUDIT_OBJ_USER:
    520		case AUDIT_OBJ_ROLE:
    521		case AUDIT_OBJ_TYPE:
    522		case AUDIT_OBJ_LEV_LOW:
    523		case AUDIT_OBJ_LEV_HIGH:
    524			str = audit_unpack_string(&bufp, &remain, f_val);
    525			if (IS_ERR(str)) {
    526				err = PTR_ERR(str);
    527				goto exit_free;
    528			}
    529			entry->rule.buflen += f_val;
    530			f->lsm_str = str;
    531			err = security_audit_rule_init(f->type, f->op, str,
    532						       (void **)&f->lsm_rule);
    533			/* Keep currently invalid fields around in case they
    534			 * become valid after a policy reload. */
    535			if (err == -EINVAL) {
    536				pr_warn("audit rule for LSM \'%s\' is invalid\n",
    537					str);
    538				err = 0;
    539			} else if (err)
    540				goto exit_free;
    541			break;
    542		case AUDIT_WATCH:
    543			str = audit_unpack_string(&bufp, &remain, f_val);
    544			if (IS_ERR(str)) {
    545				err = PTR_ERR(str);
    546				goto exit_free;
    547			}
    548			err = audit_to_watch(&entry->rule, str, f_val, f->op);
    549			if (err) {
    550				kfree(str);
    551				goto exit_free;
    552			}
    553			entry->rule.buflen += f_val;
    554			break;
    555		case AUDIT_DIR:
    556			str = audit_unpack_string(&bufp, &remain, f_val);
    557			if (IS_ERR(str)) {
    558				err = PTR_ERR(str);
    559				goto exit_free;
    560			}
    561			err = audit_make_tree(&entry->rule, str, f->op);
    562			kfree(str);
    563			if (err)
    564				goto exit_free;
    565			entry->rule.buflen += f_val;
    566			break;
    567		case AUDIT_INODE:
    568			f->val = f_val;
    569			err = audit_to_inode(&entry->rule, f);
    570			if (err)
    571				goto exit_free;
    572			break;
    573		case AUDIT_FILTERKEY:
    574			if (entry->rule.filterkey || f_val > AUDIT_MAX_KEY_LEN)
    575				goto exit_free;
    576			str = audit_unpack_string(&bufp, &remain, f_val);
    577			if (IS_ERR(str)) {
    578				err = PTR_ERR(str);
    579				goto exit_free;
    580			}
    581			entry->rule.buflen += f_val;
    582			entry->rule.filterkey = str;
    583			break;
    584		case AUDIT_EXE:
    585			if (entry->rule.exe || f_val > PATH_MAX)
    586				goto exit_free;
    587			str = audit_unpack_string(&bufp, &remain, f_val);
    588			if (IS_ERR(str)) {
    589				err = PTR_ERR(str);
    590				goto exit_free;
    591			}
    592			audit_mark = audit_alloc_mark(&entry->rule, str, f_val);
    593			if (IS_ERR(audit_mark)) {
    594				kfree(str);
    595				err = PTR_ERR(audit_mark);
    596				goto exit_free;
    597			}
    598			entry->rule.buflen += f_val;
    599			entry->rule.exe = audit_mark;
    600			break;
    601		default:
    602			f->val = f_val;
    603			break;
    604		}
    605	}
    606
    607	if (entry->rule.inode_f && entry->rule.inode_f->op == Audit_not_equal)
    608		entry->rule.inode_f = NULL;
    609
    610exit_nofree:
    611	return entry;
    612
    613exit_free:
    614	if (entry->rule.tree)
    615		audit_put_tree(entry->rule.tree); /* that's the temporary one */
    616	if (entry->rule.exe)
    617		audit_remove_mark(entry->rule.exe); /* that's the template one */
    618	audit_free_rule(entry);
    619	return ERR_PTR(err);
    620}
    621
    622/* Pack a filter field's string representation into data block. */
    623static inline size_t audit_pack_string(void **bufp, const char *str)
    624{
    625	size_t len = strlen(str);
    626
    627	memcpy(*bufp, str, len);
    628	*bufp += len;
    629
    630	return len;
    631}
    632
    633/* Translate kernel rule representation to struct audit_rule_data. */
    634static struct audit_rule_data *audit_krule_to_data(struct audit_krule *krule)
    635{
    636	struct audit_rule_data *data;
    637	void *bufp;
    638	int i;
    639
    640	data = kmalloc(struct_size(data, buf, krule->buflen), GFP_KERNEL);
    641	if (unlikely(!data))
    642		return NULL;
    643	memset(data, 0, sizeof(*data));
    644
    645	data->flags = krule->flags | krule->listnr;
    646	data->action = krule->action;
    647	data->field_count = krule->field_count;
    648	bufp = data->buf;
    649	for (i = 0; i < data->field_count; i++) {
    650		struct audit_field *f = &krule->fields[i];
    651
    652		data->fields[i] = f->type;
    653		data->fieldflags[i] = audit_ops[f->op];
    654		switch(f->type) {
    655		case AUDIT_SUBJ_USER:
    656		case AUDIT_SUBJ_ROLE:
    657		case AUDIT_SUBJ_TYPE:
    658		case AUDIT_SUBJ_SEN:
    659		case AUDIT_SUBJ_CLR:
    660		case AUDIT_OBJ_USER:
    661		case AUDIT_OBJ_ROLE:
    662		case AUDIT_OBJ_TYPE:
    663		case AUDIT_OBJ_LEV_LOW:
    664		case AUDIT_OBJ_LEV_HIGH:
    665			data->buflen += data->values[i] =
    666				audit_pack_string(&bufp, f->lsm_str);
    667			break;
    668		case AUDIT_WATCH:
    669			data->buflen += data->values[i] =
    670				audit_pack_string(&bufp,
    671						  audit_watch_path(krule->watch));
    672			break;
    673		case AUDIT_DIR:
    674			data->buflen += data->values[i] =
    675				audit_pack_string(&bufp,
    676						  audit_tree_path(krule->tree));
    677			break;
    678		case AUDIT_FILTERKEY:
    679			data->buflen += data->values[i] =
    680				audit_pack_string(&bufp, krule->filterkey);
    681			break;
    682		case AUDIT_EXE:
    683			data->buflen += data->values[i] =
    684				audit_pack_string(&bufp, audit_mark_path(krule->exe));
    685			break;
    686		case AUDIT_LOGINUID_SET:
    687			if (krule->pflags & AUDIT_LOGINUID_LEGACY && !f->val) {
    688				data->fields[i] = AUDIT_LOGINUID;
    689				data->values[i] = AUDIT_UID_UNSET;
    690				break;
    691			}
    692			fallthrough;	/* if set */
    693		default:
    694			data->values[i] = f->val;
    695		}
    696	}
    697	for (i = 0; i < AUDIT_BITMASK_SIZE; i++) data->mask[i] = krule->mask[i];
    698
    699	return data;
    700}
    701
    702/* Compare two rules in kernel format.  Considered success if rules
    703 * don't match. */
    704static int audit_compare_rule(struct audit_krule *a, struct audit_krule *b)
    705{
    706	int i;
    707
    708	if (a->flags != b->flags ||
    709	    a->pflags != b->pflags ||
    710	    a->listnr != b->listnr ||
    711	    a->action != b->action ||
    712	    a->field_count != b->field_count)
    713		return 1;
    714
    715	for (i = 0; i < a->field_count; i++) {
    716		if (a->fields[i].type != b->fields[i].type ||
    717		    a->fields[i].op != b->fields[i].op)
    718			return 1;
    719
    720		switch(a->fields[i].type) {
    721		case AUDIT_SUBJ_USER:
    722		case AUDIT_SUBJ_ROLE:
    723		case AUDIT_SUBJ_TYPE:
    724		case AUDIT_SUBJ_SEN:
    725		case AUDIT_SUBJ_CLR:
    726		case AUDIT_OBJ_USER:
    727		case AUDIT_OBJ_ROLE:
    728		case AUDIT_OBJ_TYPE:
    729		case AUDIT_OBJ_LEV_LOW:
    730		case AUDIT_OBJ_LEV_HIGH:
    731			if (strcmp(a->fields[i].lsm_str, b->fields[i].lsm_str))
    732				return 1;
    733			break;
    734		case AUDIT_WATCH:
    735			if (strcmp(audit_watch_path(a->watch),
    736				   audit_watch_path(b->watch)))
    737				return 1;
    738			break;
    739		case AUDIT_DIR:
    740			if (strcmp(audit_tree_path(a->tree),
    741				   audit_tree_path(b->tree)))
    742				return 1;
    743			break;
    744		case AUDIT_FILTERKEY:
    745			/* both filterkeys exist based on above type compare */
    746			if (strcmp(a->filterkey, b->filterkey))
    747				return 1;
    748			break;
    749		case AUDIT_EXE:
    750			/* both paths exist based on above type compare */
    751			if (strcmp(audit_mark_path(a->exe),
    752				   audit_mark_path(b->exe)))
    753				return 1;
    754			break;
    755		case AUDIT_UID:
    756		case AUDIT_EUID:
    757		case AUDIT_SUID:
    758		case AUDIT_FSUID:
    759		case AUDIT_LOGINUID:
    760		case AUDIT_OBJ_UID:
    761			if (!uid_eq(a->fields[i].uid, b->fields[i].uid))
    762				return 1;
    763			break;
    764		case AUDIT_GID:
    765		case AUDIT_EGID:
    766		case AUDIT_SGID:
    767		case AUDIT_FSGID:
    768		case AUDIT_OBJ_GID:
    769			if (!gid_eq(a->fields[i].gid, b->fields[i].gid))
    770				return 1;
    771			break;
    772		default:
    773			if (a->fields[i].val != b->fields[i].val)
    774				return 1;
    775		}
    776	}
    777
    778	for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
    779		if (a->mask[i] != b->mask[i])
    780			return 1;
    781
    782	return 0;
    783}
    784
    785/* Duplicate LSM field information.  The lsm_rule is opaque, so must be
    786 * re-initialized. */
    787static inline int audit_dupe_lsm_field(struct audit_field *df,
    788					   struct audit_field *sf)
    789{
    790	int ret = 0;
    791	char *lsm_str;
    792
    793	/* our own copy of lsm_str */
    794	lsm_str = kstrdup(sf->lsm_str, GFP_KERNEL);
    795	if (unlikely(!lsm_str))
    796		return -ENOMEM;
    797	df->lsm_str = lsm_str;
    798
    799	/* our own (refreshed) copy of lsm_rule */
    800	ret = security_audit_rule_init(df->type, df->op, df->lsm_str,
    801				       (void **)&df->lsm_rule);
    802	/* Keep currently invalid fields around in case they
    803	 * become valid after a policy reload. */
    804	if (ret == -EINVAL) {
    805		pr_warn("audit rule for LSM \'%s\' is invalid\n",
    806			df->lsm_str);
    807		ret = 0;
    808	}
    809
    810	return ret;
    811}
    812
    813/* Duplicate an audit rule.  This will be a deep copy with the exception
    814 * of the watch - that pointer is carried over.  The LSM specific fields
    815 * will be updated in the copy.  The point is to be able to replace the old
    816 * rule with the new rule in the filterlist, then free the old rule.
    817 * The rlist element is undefined; list manipulations are handled apart from
    818 * the initial copy. */
    819struct audit_entry *audit_dupe_rule(struct audit_krule *old)
    820{
    821	u32 fcount = old->field_count;
    822	struct audit_entry *entry;
    823	struct audit_krule *new;
    824	char *fk;
    825	int i, err = 0;
    826
    827	entry = audit_init_entry(fcount);
    828	if (unlikely(!entry))
    829		return ERR_PTR(-ENOMEM);
    830
    831	new = &entry->rule;
    832	new->flags = old->flags;
    833	new->pflags = old->pflags;
    834	new->listnr = old->listnr;
    835	new->action = old->action;
    836	for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
    837		new->mask[i] = old->mask[i];
    838	new->prio = old->prio;
    839	new->buflen = old->buflen;
    840	new->inode_f = old->inode_f;
    841	new->field_count = old->field_count;
    842
    843	/*
    844	 * note that we are OK with not refcounting here; audit_match_tree()
    845	 * never dereferences tree and we can't get false positives there
    846	 * since we'd have to have rule gone from the list *and* removed
    847	 * before the chunks found by lookup had been allocated, i.e. before
    848	 * the beginning of list scan.
    849	 */
    850	new->tree = old->tree;
    851	memcpy(new->fields, old->fields, sizeof(struct audit_field) * fcount);
    852
    853	/* deep copy this information, updating the lsm_rule fields, because
    854	 * the originals will all be freed when the old rule is freed. */
    855	for (i = 0; i < fcount; i++) {
    856		switch (new->fields[i].type) {
    857		case AUDIT_SUBJ_USER:
    858		case AUDIT_SUBJ_ROLE:
    859		case AUDIT_SUBJ_TYPE:
    860		case AUDIT_SUBJ_SEN:
    861		case AUDIT_SUBJ_CLR:
    862		case AUDIT_OBJ_USER:
    863		case AUDIT_OBJ_ROLE:
    864		case AUDIT_OBJ_TYPE:
    865		case AUDIT_OBJ_LEV_LOW:
    866		case AUDIT_OBJ_LEV_HIGH:
    867			err = audit_dupe_lsm_field(&new->fields[i],
    868						       &old->fields[i]);
    869			break;
    870		case AUDIT_FILTERKEY:
    871			fk = kstrdup(old->filterkey, GFP_KERNEL);
    872			if (unlikely(!fk))
    873				err = -ENOMEM;
    874			else
    875				new->filterkey = fk;
    876			break;
    877		case AUDIT_EXE:
    878			err = audit_dupe_exe(new, old);
    879			break;
    880		}
    881		if (err) {
    882			if (new->exe)
    883				audit_remove_mark(new->exe);
    884			audit_free_rule(entry);
    885			return ERR_PTR(err);
    886		}
    887	}
    888
    889	if (old->watch) {
    890		audit_get_watch(old->watch);
    891		new->watch = old->watch;
    892	}
    893
    894	return entry;
    895}
    896
    897/* Find an existing audit rule.
    898 * Caller must hold audit_filter_mutex to prevent stale rule data. */
    899static struct audit_entry *audit_find_rule(struct audit_entry *entry,
    900					   struct list_head **p)
    901{
    902	struct audit_entry *e, *found = NULL;
    903	struct list_head *list;
    904	int h;
    905
    906	if (entry->rule.inode_f) {
    907		h = audit_hash_ino(entry->rule.inode_f->val);
    908		*p = list = &audit_inode_hash[h];
    909	} else if (entry->rule.watch) {
    910		/* we don't know the inode number, so must walk entire hash */
    911		for (h = 0; h < AUDIT_INODE_BUCKETS; h++) {
    912			list = &audit_inode_hash[h];
    913			list_for_each_entry(e, list, list)
    914				if (!audit_compare_rule(&entry->rule, &e->rule)) {
    915					found = e;
    916					goto out;
    917				}
    918		}
    919		goto out;
    920	} else {
    921		*p = list = &audit_filter_list[entry->rule.listnr];
    922	}
    923
    924	list_for_each_entry(e, list, list)
    925		if (!audit_compare_rule(&entry->rule, &e->rule)) {
    926			found = e;
    927			goto out;
    928		}
    929
    930out:
    931	return found;
    932}
    933
    934static u64 prio_low = ~0ULL/2;
    935static u64 prio_high = ~0ULL/2 - 1;
    936
    937/* Add rule to given filterlist if not a duplicate. */
    938static inline int audit_add_rule(struct audit_entry *entry)
    939{
    940	struct audit_entry *e;
    941	struct audit_watch *watch = entry->rule.watch;
    942	struct audit_tree *tree = entry->rule.tree;
    943	struct list_head *list;
    944	int err = 0;
    945#ifdef CONFIG_AUDITSYSCALL
    946	int dont_count = 0;
    947
    948	/* If any of these, don't count towards total */
    949	switch(entry->rule.listnr) {
    950	case AUDIT_FILTER_USER:
    951	case AUDIT_FILTER_EXCLUDE:
    952	case AUDIT_FILTER_FS:
    953		dont_count = 1;
    954	}
    955#endif
    956
    957	mutex_lock(&audit_filter_mutex);
    958	e = audit_find_rule(entry, &list);
    959	if (e) {
    960		mutex_unlock(&audit_filter_mutex);
    961		err = -EEXIST;
    962		/* normally audit_add_tree_rule() will free it on failure */
    963		if (tree)
    964			audit_put_tree(tree);
    965		return err;
    966	}
    967
    968	if (watch) {
    969		/* audit_filter_mutex is dropped and re-taken during this call */
    970		err = audit_add_watch(&entry->rule, &list);
    971		if (err) {
    972			mutex_unlock(&audit_filter_mutex);
    973			/*
    974			 * normally audit_add_tree_rule() will free it
    975			 * on failure
    976			 */
    977			if (tree)
    978				audit_put_tree(tree);
    979			return err;
    980		}
    981	}
    982	if (tree) {
    983		err = audit_add_tree_rule(&entry->rule);
    984		if (err) {
    985			mutex_unlock(&audit_filter_mutex);
    986			return err;
    987		}
    988	}
    989
    990	entry->rule.prio = ~0ULL;
    991	if (entry->rule.listnr == AUDIT_FILTER_EXIT ||
    992	    entry->rule.listnr == AUDIT_FILTER_URING_EXIT) {
    993		if (entry->rule.flags & AUDIT_FILTER_PREPEND)
    994			entry->rule.prio = ++prio_high;
    995		else
    996			entry->rule.prio = --prio_low;
    997	}
    998
    999	if (entry->rule.flags & AUDIT_FILTER_PREPEND) {
   1000		list_add(&entry->rule.list,
   1001			 &audit_rules_list[entry->rule.listnr]);
   1002		list_add_rcu(&entry->list, list);
   1003		entry->rule.flags &= ~AUDIT_FILTER_PREPEND;
   1004	} else {
   1005		list_add_tail(&entry->rule.list,
   1006			      &audit_rules_list[entry->rule.listnr]);
   1007		list_add_tail_rcu(&entry->list, list);
   1008	}
   1009#ifdef CONFIG_AUDITSYSCALL
   1010	if (!dont_count)
   1011		audit_n_rules++;
   1012
   1013	if (!audit_match_signal(entry))
   1014		audit_signals++;
   1015#endif
   1016	mutex_unlock(&audit_filter_mutex);
   1017
   1018	return err;
   1019}
   1020
   1021/* Remove an existing rule from filterlist. */
   1022int audit_del_rule(struct audit_entry *entry)
   1023{
   1024	struct audit_entry  *e;
   1025	struct audit_tree *tree = entry->rule.tree;
   1026	struct list_head *list;
   1027	int ret = 0;
   1028#ifdef CONFIG_AUDITSYSCALL
   1029	int dont_count = 0;
   1030
   1031	/* If any of these, don't count towards total */
   1032	switch(entry->rule.listnr) {
   1033	case AUDIT_FILTER_USER:
   1034	case AUDIT_FILTER_EXCLUDE:
   1035	case AUDIT_FILTER_FS:
   1036		dont_count = 1;
   1037	}
   1038#endif
   1039
   1040	mutex_lock(&audit_filter_mutex);
   1041	e = audit_find_rule(entry, &list);
   1042	if (!e) {
   1043		ret = -ENOENT;
   1044		goto out;
   1045	}
   1046
   1047	if (e->rule.watch)
   1048		audit_remove_watch_rule(&e->rule);
   1049
   1050	if (e->rule.tree)
   1051		audit_remove_tree_rule(&e->rule);
   1052
   1053	if (e->rule.exe)
   1054		audit_remove_mark_rule(&e->rule);
   1055
   1056#ifdef CONFIG_AUDITSYSCALL
   1057	if (!dont_count)
   1058		audit_n_rules--;
   1059
   1060	if (!audit_match_signal(entry))
   1061		audit_signals--;
   1062#endif
   1063
   1064	list_del_rcu(&e->list);
   1065	list_del(&e->rule.list);
   1066	call_rcu(&e->rcu, audit_free_rule_rcu);
   1067
   1068out:
   1069	mutex_unlock(&audit_filter_mutex);
   1070
   1071	if (tree)
   1072		audit_put_tree(tree);	/* that's the temporary one */
   1073
   1074	return ret;
   1075}
   1076
   1077/* List rules using struct audit_rule_data. */
   1078static void audit_list_rules(int seq, struct sk_buff_head *q)
   1079{
   1080	struct sk_buff *skb;
   1081	struct audit_krule *r;
   1082	int i;
   1083
   1084	/* This is a blocking read, so use audit_filter_mutex instead of rcu
   1085	 * iterator to sync with list writers. */
   1086	for (i=0; i<AUDIT_NR_FILTERS; i++) {
   1087		list_for_each_entry(r, &audit_rules_list[i], list) {
   1088			struct audit_rule_data *data;
   1089
   1090			data = audit_krule_to_data(r);
   1091			if (unlikely(!data))
   1092				break;
   1093			skb = audit_make_reply(seq, AUDIT_LIST_RULES, 0, 1,
   1094					       data,
   1095					       struct_size(data, buf, data->buflen));
   1096			if (skb)
   1097				skb_queue_tail(q, skb);
   1098			kfree(data);
   1099		}
   1100	}
   1101	skb = audit_make_reply(seq, AUDIT_LIST_RULES, 1, 1, NULL, 0);
   1102	if (skb)
   1103		skb_queue_tail(q, skb);
   1104}
   1105
   1106/* Log rule additions and removals */
   1107static void audit_log_rule_change(char *action, struct audit_krule *rule, int res)
   1108{
   1109	struct audit_buffer *ab;
   1110
   1111	if (!audit_enabled)
   1112		return;
   1113
   1114	ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_CONFIG_CHANGE);
   1115	if (!ab)
   1116		return;
   1117	audit_log_session_info(ab);
   1118	audit_log_task_context(ab);
   1119	audit_log_format(ab, " op=%s", action);
   1120	audit_log_key(ab, rule->filterkey);
   1121	audit_log_format(ab, " list=%d res=%d", rule->listnr, res);
   1122	audit_log_end(ab);
   1123}
   1124
   1125/**
   1126 * audit_rule_change - apply all rules to the specified message type
   1127 * @type: audit message type
   1128 * @seq: netlink audit message sequence (serial) number
   1129 * @data: payload data
   1130 * @datasz: size of payload data
   1131 */
   1132int audit_rule_change(int type, int seq, void *data, size_t datasz)
   1133{
   1134	int err = 0;
   1135	struct audit_entry *entry;
   1136
   1137	switch (type) {
   1138	case AUDIT_ADD_RULE:
   1139		entry = audit_data_to_entry(data, datasz);
   1140		if (IS_ERR(entry))
   1141			return PTR_ERR(entry);
   1142		err = audit_add_rule(entry);
   1143		audit_log_rule_change("add_rule", &entry->rule, !err);
   1144		break;
   1145	case AUDIT_DEL_RULE:
   1146		entry = audit_data_to_entry(data, datasz);
   1147		if (IS_ERR(entry))
   1148			return PTR_ERR(entry);
   1149		err = audit_del_rule(entry);
   1150		audit_log_rule_change("remove_rule", &entry->rule, !err);
   1151		break;
   1152	default:
   1153		WARN_ON(1);
   1154		return -EINVAL;
   1155	}
   1156
   1157	if (err || type == AUDIT_DEL_RULE) {
   1158		if (entry->rule.exe)
   1159			audit_remove_mark(entry->rule.exe);
   1160		audit_free_rule(entry);
   1161	}
   1162
   1163	return err;
   1164}
   1165
   1166/**
   1167 * audit_list_rules_send - list the audit rules
   1168 * @request_skb: skb of request we are replying to (used to target the reply)
   1169 * @seq: netlink audit message sequence (serial) number
   1170 */
   1171int audit_list_rules_send(struct sk_buff *request_skb, int seq)
   1172{
   1173	struct task_struct *tsk;
   1174	struct audit_netlink_list *dest;
   1175
   1176	/* We can't just spew out the rules here because we might fill
   1177	 * the available socket buffer space and deadlock waiting for
   1178	 * auditctl to read from it... which isn't ever going to
   1179	 * happen if we're actually running in the context of auditctl
   1180	 * trying to _send_ the stuff */
   1181
   1182	dest = kmalloc(sizeof(*dest), GFP_KERNEL);
   1183	if (!dest)
   1184		return -ENOMEM;
   1185	dest->net = get_net(sock_net(NETLINK_CB(request_skb).sk));
   1186	dest->portid = NETLINK_CB(request_skb).portid;
   1187	skb_queue_head_init(&dest->q);
   1188
   1189	mutex_lock(&audit_filter_mutex);
   1190	audit_list_rules(seq, &dest->q);
   1191	mutex_unlock(&audit_filter_mutex);
   1192
   1193	tsk = kthread_run(audit_send_list_thread, dest, "audit_send_list");
   1194	if (IS_ERR(tsk)) {
   1195		skb_queue_purge(&dest->q);
   1196		put_net(dest->net);
   1197		kfree(dest);
   1198		return PTR_ERR(tsk);
   1199	}
   1200
   1201	return 0;
   1202}
   1203
   1204int audit_comparator(u32 left, u32 op, u32 right)
   1205{
   1206	switch (op) {
   1207	case Audit_equal:
   1208		return (left == right);
   1209	case Audit_not_equal:
   1210		return (left != right);
   1211	case Audit_lt:
   1212		return (left < right);
   1213	case Audit_le:
   1214		return (left <= right);
   1215	case Audit_gt:
   1216		return (left > right);
   1217	case Audit_ge:
   1218		return (left >= right);
   1219	case Audit_bitmask:
   1220		return (left & right);
   1221	case Audit_bittest:
   1222		return ((left & right) == right);
   1223	default:
   1224		return 0;
   1225	}
   1226}
   1227
   1228int audit_uid_comparator(kuid_t left, u32 op, kuid_t right)
   1229{
   1230	switch (op) {
   1231	case Audit_equal:
   1232		return uid_eq(left, right);
   1233	case Audit_not_equal:
   1234		return !uid_eq(left, right);
   1235	case Audit_lt:
   1236		return uid_lt(left, right);
   1237	case Audit_le:
   1238		return uid_lte(left, right);
   1239	case Audit_gt:
   1240		return uid_gt(left, right);
   1241	case Audit_ge:
   1242		return uid_gte(left, right);
   1243	case Audit_bitmask:
   1244	case Audit_bittest:
   1245	default:
   1246		return 0;
   1247	}
   1248}
   1249
   1250int audit_gid_comparator(kgid_t left, u32 op, kgid_t right)
   1251{
   1252	switch (op) {
   1253	case Audit_equal:
   1254		return gid_eq(left, right);
   1255	case Audit_not_equal:
   1256		return !gid_eq(left, right);
   1257	case Audit_lt:
   1258		return gid_lt(left, right);
   1259	case Audit_le:
   1260		return gid_lte(left, right);
   1261	case Audit_gt:
   1262		return gid_gt(left, right);
   1263	case Audit_ge:
   1264		return gid_gte(left, right);
   1265	case Audit_bitmask:
   1266	case Audit_bittest:
   1267	default:
   1268		return 0;
   1269	}
   1270}
   1271
   1272/**
   1273 * parent_len - find the length of the parent portion of a pathname
   1274 * @path: pathname of which to determine length
   1275 */
   1276int parent_len(const char *path)
   1277{
   1278	int plen;
   1279	const char *p;
   1280
   1281	plen = strlen(path);
   1282
   1283	if (plen == 0)
   1284		return plen;
   1285
   1286	/* disregard trailing slashes */
   1287	p = path + plen - 1;
   1288	while ((*p == '/') && (p > path))
   1289		p--;
   1290
   1291	/* walk backward until we find the next slash or hit beginning */
   1292	while ((*p != '/') && (p > path))
   1293		p--;
   1294
   1295	/* did we find a slash? Then increment to include it in path */
   1296	if (*p == '/')
   1297		p++;
   1298
   1299	return p - path;
   1300}
   1301
   1302/**
   1303 * audit_compare_dname_path - compare given dentry name with last component in
   1304 * 			      given path. Return of 0 indicates a match.
   1305 * @dname:	dentry name that we're comparing
   1306 * @path:	full pathname that we're comparing
   1307 * @parentlen:	length of the parent if known. Passing in AUDIT_NAME_FULL
   1308 * 		here indicates that we must compute this value.
   1309 */
   1310int audit_compare_dname_path(const struct qstr *dname, const char *path, int parentlen)
   1311{
   1312	int dlen, pathlen;
   1313	const char *p;
   1314
   1315	dlen = dname->len;
   1316	pathlen = strlen(path);
   1317	if (pathlen < dlen)
   1318		return 1;
   1319
   1320	parentlen = parentlen == AUDIT_NAME_FULL ? parent_len(path) : parentlen;
   1321	if (pathlen - parentlen != dlen)
   1322		return 1;
   1323
   1324	p = path + parentlen;
   1325
   1326	return strncmp(p, dname->name, dlen);
   1327}
   1328
   1329int audit_filter(int msgtype, unsigned int listtype)
   1330{
   1331	struct audit_entry *e;
   1332	int ret = 1; /* Audit by default */
   1333
   1334	rcu_read_lock();
   1335	list_for_each_entry_rcu(e, &audit_filter_list[listtype], list) {
   1336		int i, result = 0;
   1337
   1338		for (i = 0; i < e->rule.field_count; i++) {
   1339			struct audit_field *f = &e->rule.fields[i];
   1340			pid_t pid;
   1341			u32 sid;
   1342
   1343			switch (f->type) {
   1344			case AUDIT_PID:
   1345				pid = task_pid_nr(current);
   1346				result = audit_comparator(pid, f->op, f->val);
   1347				break;
   1348			case AUDIT_UID:
   1349				result = audit_uid_comparator(current_uid(), f->op, f->uid);
   1350				break;
   1351			case AUDIT_GID:
   1352				result = audit_gid_comparator(current_gid(), f->op, f->gid);
   1353				break;
   1354			case AUDIT_LOGINUID:
   1355				result = audit_uid_comparator(audit_get_loginuid(current),
   1356							      f->op, f->uid);
   1357				break;
   1358			case AUDIT_LOGINUID_SET:
   1359				result = audit_comparator(audit_loginuid_set(current),
   1360							  f->op, f->val);
   1361				break;
   1362			case AUDIT_MSGTYPE:
   1363				result = audit_comparator(msgtype, f->op, f->val);
   1364				break;
   1365			case AUDIT_SUBJ_USER:
   1366			case AUDIT_SUBJ_ROLE:
   1367			case AUDIT_SUBJ_TYPE:
   1368			case AUDIT_SUBJ_SEN:
   1369			case AUDIT_SUBJ_CLR:
   1370				if (f->lsm_rule) {
   1371					security_current_getsecid_subj(&sid);
   1372					result = security_audit_rule_match(sid,
   1373						   f->type, f->op, f->lsm_rule);
   1374				}
   1375				break;
   1376			case AUDIT_EXE:
   1377				result = audit_exe_compare(current, e->rule.exe);
   1378				if (f->op == Audit_not_equal)
   1379					result = !result;
   1380				break;
   1381			default:
   1382				goto unlock_and_return;
   1383			}
   1384			if (result < 0) /* error */
   1385				goto unlock_and_return;
   1386			if (!result)
   1387				break;
   1388		}
   1389		if (result > 0) {
   1390			if (e->rule.action == AUDIT_NEVER || listtype == AUDIT_FILTER_EXCLUDE)
   1391				ret = 0;
   1392			break;
   1393		}
   1394	}
   1395unlock_and_return:
   1396	rcu_read_unlock();
   1397	return ret;
   1398}
   1399
   1400static int update_lsm_rule(struct audit_krule *r)
   1401{
   1402	struct audit_entry *entry = container_of(r, struct audit_entry, rule);
   1403	struct audit_entry *nentry;
   1404	int err = 0;
   1405
   1406	if (!security_audit_rule_known(r))
   1407		return 0;
   1408
   1409	nentry = audit_dupe_rule(r);
   1410	if (entry->rule.exe)
   1411		audit_remove_mark(entry->rule.exe);
   1412	if (IS_ERR(nentry)) {
   1413		/* save the first error encountered for the
   1414		 * return value */
   1415		err = PTR_ERR(nentry);
   1416		audit_panic("error updating LSM filters");
   1417		if (r->watch)
   1418			list_del(&r->rlist);
   1419		list_del_rcu(&entry->list);
   1420		list_del(&r->list);
   1421	} else {
   1422		if (r->watch || r->tree)
   1423			list_replace_init(&r->rlist, &nentry->rule.rlist);
   1424		list_replace_rcu(&entry->list, &nentry->list);
   1425		list_replace(&r->list, &nentry->rule.list);
   1426	}
   1427	call_rcu(&entry->rcu, audit_free_rule_rcu);
   1428
   1429	return err;
   1430}
   1431
   1432/* This function will re-initialize the lsm_rule field of all applicable rules.
   1433 * It will traverse the filter lists serarching for rules that contain LSM
   1434 * specific filter fields.  When such a rule is found, it is copied, the
   1435 * LSM field is re-initialized, and the old rule is replaced with the
   1436 * updated rule. */
   1437int audit_update_lsm_rules(void)
   1438{
   1439	struct audit_krule *r, *n;
   1440	int i, err = 0;
   1441
   1442	/* audit_filter_mutex synchronizes the writers */
   1443	mutex_lock(&audit_filter_mutex);
   1444
   1445	for (i = 0; i < AUDIT_NR_FILTERS; i++) {
   1446		list_for_each_entry_safe(r, n, &audit_rules_list[i], list) {
   1447			int res = update_lsm_rule(r);
   1448			if (!err)
   1449				err = res;
   1450		}
   1451	}
   1452	mutex_unlock(&audit_filter_mutex);
   1453
   1454	return err;
   1455}