linux/kernel/auditfilter.c
<<
>>
Prefs
   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}
1456