1 // SPDX-License-Identifier: GPL-2.0 2 #include "audit.h" 3 #include <linux/fsnotify_backend.h> 4 #include <linux/namei.h> 5 #include <linux/mount.h> 6 #include <linux/kthread.h> 7 #include <linux/refcount.h> 8 #include <linux/slab.h> 9 10 struct audit_tree; 11 struct audit_chunk; 12 13 struct audit_tree { 14 refcount_t count; 15 int goner; 16 struct audit_chunk *root; 17 struct list_head chunks; 18 struct list_head rules; 19 struct list_head list; 20 struct list_head same_root; 21 struct rcu_head head; 22 char pathname[]; 23 }; 24 25 struct audit_chunk { 26 struct list_head hash; 27 unsigned long key; 28 struct fsnotify_mark *mark; 29 struct list_head trees; /* with root here */ 30 int count; 31 atomic_long_t refs; 32 struct rcu_head head; 33 struct audit_node { 34 struct list_head list; 35 struct audit_tree *owner; 36 unsigned int index; /* index; upper bit indicates 'will prune' */ 37 } owners[] __counted_by(count); 38 }; 39 40 struct audit_tree_mark { 41 struct fsnotify_mark mark; 42 struct audit_chunk *chunk; 43 }; 44 45 static LIST_HEAD(tree_list); 46 static LIST_HEAD(prune_list); 47 static struct task_struct *prune_thread; 48 49 /* 50 * One struct chunk is attached to each inode of interest through 51 * audit_tree_mark (fsnotify mark). We replace struct chunk on tagging / 52 * untagging, the mark is stable as long as there is chunk attached. The 53 * association between mark and chunk is protected by hash_lock and 54 * audit_tree_group->mark_mutex. Thus as long as we hold 55 * audit_tree_group->mark_mutex and check that the mark is alive by 56 * FSNOTIFY_MARK_FLAG_ATTACHED flag check, we are sure the mark points to 57 * the current chunk. 58 * 59 * Rules have pointer to struct audit_tree. 60 * Rules have struct list_head rlist forming a list of rules over 61 * the same tree. 62 * References to struct chunk are collected at audit_inode{,_child}() 63 * time and used in AUDIT_TREE rule matching. 64 * These references are dropped at the same time we are calling 65 * audit_free_names(), etc. 66 * 67 * Cyclic lists galore: 68 * tree.chunks anchors chunk.owners[].list hash_lock 69 * tree.rules anchors rule.rlist audit_filter_mutex 70 * chunk.trees anchors tree.same_root hash_lock 71 * chunk.hash is a hash with middle bits of watch.inode as 72 * a hash function. RCU, hash_lock 73 * 74 * tree is refcounted; one reference for "some rules on rules_list refer to 75 * it", one for each chunk with pointer to it. 76 * 77 * chunk is refcounted by embedded .refs. Mark associated with the chunk holds 78 * one chunk reference. This reference is dropped either when a mark is going 79 * to be freed (corresponding inode goes away) or when chunk attached to the 80 * mark gets replaced. This reference must be dropped using 81 * audit_mark_put_chunk() to make sure the reference is dropped only after RCU 82 * grace period as it protects RCU readers of the hash table. 83 * 84 * node.index allows to get from node.list to containing chunk. 85 * MSB of that sucker is stolen to mark taggings that we might have to 86 * revert - several operations have very unpleasant cleanup logics and 87 * that makes a difference. Some. 88 */ 89 90 static struct fsnotify_group *audit_tree_group __ro_after_init; 91 static struct kmem_cache *audit_tree_mark_cachep __ro_after_init; 92 93 static struct audit_tree *alloc_tree(const char *s) 94 { 95 struct audit_tree *tree; 96 size_t sz; 97 98 sz = strlen(s) + 1; 99 tree = kmalloc_flex(*tree, pathname, sz); 100 if (tree) { 101 refcount_set(&tree->count, 1); 102 tree->goner = 0; 103 INIT_LIST_HEAD(&tree->chunks); 104 INIT_LIST_HEAD(&tree->rules); 105 INIT_LIST_HEAD(&tree->list); 106 INIT_LIST_HEAD(&tree->same_root); 107 tree->root = NULL; 108 strscpy(tree->pathname, s, sz); 109 } 110 return tree; 111 } 112 113 static inline void get_tree(struct audit_tree *tree) 114 { 115 refcount_inc(&tree->count); 116 } 117 118 static inline void put_tree(struct audit_tree *tree) 119 { 120 if (refcount_dec_and_test(&tree->count)) 121 kfree_rcu(tree, head); 122 } 123 124 /* to avoid bringing the entire thing in audit.h */ 125 const char *audit_tree_path(struct audit_tree *tree) 126 { 127 return tree->pathname; 128 } 129 130 static void free_chunk(struct audit_chunk *chunk) 131 { 132 int i; 133 134 for (i = 0; i < chunk->count; i++) { 135 if (chunk->owners[i].owner) 136 put_tree(chunk->owners[i].owner); 137 } 138 kfree(chunk); 139 } 140 141 void audit_put_chunk(struct audit_chunk *chunk) 142 { 143 if (atomic_long_dec_and_test(&chunk->refs)) 144 free_chunk(chunk); 145 } 146 147 static void __put_chunk(struct rcu_head *rcu) 148 { 149 struct audit_chunk *chunk = container_of(rcu, struct audit_chunk, head); 150 audit_put_chunk(chunk); 151 } 152 153 /* 154 * Drop reference to the chunk that was held by the mark. This is the reference 155 * that gets dropped after we've removed the chunk from the hash table and we 156 * use it to make sure chunk cannot be freed before RCU grace period expires. 157 */ 158 static void audit_mark_put_chunk(struct audit_chunk *chunk) 159 { 160 call_rcu(&chunk->head, __put_chunk); 161 } 162 163 static inline struct audit_tree_mark *audit_mark(struct fsnotify_mark *mark) 164 { 165 return container_of(mark, struct audit_tree_mark, mark); 166 } 167 168 static struct audit_chunk *mark_chunk(struct fsnotify_mark *mark) 169 { 170 return audit_mark(mark)->chunk; 171 } 172 173 static void audit_tree_destroy_watch(struct fsnotify_mark *mark) 174 { 175 kmem_cache_free(audit_tree_mark_cachep, audit_mark(mark)); 176 } 177 178 static struct fsnotify_mark *alloc_mark(void) 179 { 180 struct audit_tree_mark *amark; 181 182 amark = kmem_cache_zalloc(audit_tree_mark_cachep, GFP_KERNEL); 183 if (!amark) 184 return NULL; 185 fsnotify_init_mark(&amark->mark, audit_tree_group); 186 amark->mark.mask = FS_IN_IGNORED; 187 return &amark->mark; 188 } 189 190 static struct audit_chunk *alloc_chunk(int count) 191 { 192 struct audit_chunk *chunk; 193 int i; 194 195 chunk = kzalloc_flex(*chunk, owners, count); 196 if (!chunk) 197 return NULL; 198 199 INIT_LIST_HEAD(&chunk->hash); 200 INIT_LIST_HEAD(&chunk->trees); 201 chunk->count = count; 202 atomic_long_set(&chunk->refs, 1); 203 for (i = 0; i < count; i++) { 204 INIT_LIST_HEAD(&chunk->owners[i].list); 205 chunk->owners[i].index = i; 206 } 207 return chunk; 208 } 209 210 enum {HASH_SIZE = 128}; 211 static struct list_head chunk_hash_heads[HASH_SIZE]; 212 static __cacheline_aligned_in_smp DEFINE_SPINLOCK(hash_lock); 213 214 /* Function to return search key in our hash from inode. */ 215 static unsigned long inode_to_key(const struct inode *inode) 216 { 217 /* Use address pointed to by connector->obj as the key */ 218 return (unsigned long)&inode->i_fsnotify_marks; 219 } 220 221 static inline struct list_head *chunk_hash(unsigned long key) 222 { 223 unsigned long n = key / L1_CACHE_BYTES; 224 return chunk_hash_heads + n % HASH_SIZE; 225 } 226 227 /* hash_lock & mark->group->mark_mutex is held by caller */ 228 static void insert_hash(struct audit_chunk *chunk) 229 { 230 struct list_head *list; 231 232 /* 233 * Make sure chunk is fully initialized before making it visible in the 234 * hash. Pairs with a data dependency barrier in READ_ONCE() in 235 * audit_tree_lookup(). 236 */ 237 smp_wmb(); 238 WARN_ON_ONCE(!chunk->key); 239 list = chunk_hash(chunk->key); 240 list_add_rcu(&chunk->hash, list); 241 } 242 243 /* called under rcu_read_lock */ 244 struct audit_chunk *audit_tree_lookup(const struct inode *inode) 245 { 246 unsigned long key = inode_to_key(inode); 247 struct list_head *list = chunk_hash(key); 248 struct audit_chunk *p; 249 250 list_for_each_entry_rcu(p, list, hash) { 251 /* 252 * We use a data dependency barrier in READ_ONCE() to make sure 253 * the chunk we see is fully initialized. 254 */ 255 if (READ_ONCE(p->key) == key) { 256 atomic_long_inc(&p->refs); 257 return p; 258 } 259 } 260 return NULL; 261 } 262 263 bool audit_tree_match(struct audit_chunk *chunk, struct audit_tree *tree) 264 { 265 int n; 266 for (n = 0; n < chunk->count; n++) 267 if (chunk->owners[n].owner == tree) 268 return true; 269 return false; 270 } 271 272 /* tagging and untagging inodes with trees */ 273 274 static struct audit_chunk *find_chunk(struct audit_node *p) 275 { 276 int index = p->index & ~(1U<<31); 277 p -= index; 278 return container_of(p, struct audit_chunk, owners[0]); 279 } 280 281 static void replace_mark_chunk(struct fsnotify_mark *mark, 282 struct audit_chunk *chunk) 283 { 284 struct audit_chunk *old; 285 286 assert_spin_locked(&hash_lock); 287 old = mark_chunk(mark); 288 audit_mark(mark)->chunk = chunk; 289 if (chunk) 290 chunk->mark = mark; 291 if (old) 292 old->mark = NULL; 293 } 294 295 static void replace_chunk(struct audit_chunk *new, struct audit_chunk *old) 296 { 297 struct audit_tree *owner; 298 int i, j; 299 300 new->key = old->key; 301 list_splice_init(&old->trees, &new->trees); 302 list_for_each_entry(owner, &new->trees, same_root) 303 owner->root = new; 304 for (i = j = 0; j < old->count; i++, j++) { 305 if (!old->owners[j].owner) { 306 i--; 307 continue; 308 } 309 owner = old->owners[j].owner; 310 new->owners[i].owner = owner; 311 new->owners[i].index = old->owners[j].index - j + i; 312 if (!owner) /* result of earlier fallback */ 313 continue; 314 get_tree(owner); 315 list_replace_init(&old->owners[j].list, &new->owners[i].list); 316 } 317 replace_mark_chunk(old->mark, new); 318 /* 319 * Make sure chunk is fully initialized before making it visible in the 320 * hash. Pairs with a data dependency barrier in READ_ONCE() in 321 * audit_tree_lookup(). 322 */ 323 smp_wmb(); 324 list_replace_rcu(&old->hash, &new->hash); 325 } 326 327 static void remove_chunk_node(struct audit_chunk *chunk, struct audit_node *p) 328 { 329 struct audit_tree *owner = p->owner; 330 331 if (owner->root == chunk) { 332 list_del_init(&owner->same_root); 333 owner->root = NULL; 334 } 335 list_del_init(&p->list); 336 p->owner = NULL; 337 put_tree(owner); 338 } 339 340 static int chunk_count_trees(struct audit_chunk *chunk) 341 { 342 int i; 343 int ret = 0; 344 345 for (i = 0; i < chunk->count; i++) 346 if (chunk->owners[i].owner) 347 ret++; 348 return ret; 349 } 350 351 static void untag_chunk(struct audit_chunk *chunk, struct fsnotify_mark *mark) 352 { 353 struct audit_chunk *new; 354 int size; 355 356 fsnotify_group_lock(audit_tree_group); 357 /* 358 * mark_mutex stabilizes chunk attached to the mark so we can check 359 * whether it didn't change while we've dropped hash_lock. 360 */ 361 if (!(mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED) || 362 mark_chunk(mark) != chunk) 363 goto out_mutex; 364 365 size = chunk_count_trees(chunk); 366 if (!size) { 367 spin_lock(&hash_lock); 368 list_del_init(&chunk->trees); 369 list_del_rcu(&chunk->hash); 370 replace_mark_chunk(mark, NULL); 371 spin_unlock(&hash_lock); 372 fsnotify_detach_mark(mark); 373 fsnotify_group_unlock(audit_tree_group); 374 audit_mark_put_chunk(chunk); 375 fsnotify_free_mark(mark); 376 return; 377 } 378 379 new = alloc_chunk(size); 380 if (!new) 381 goto out_mutex; 382 383 spin_lock(&hash_lock); 384 /* 385 * This has to go last when updating chunk as once replace_chunk() is 386 * called, new RCU readers can see the new chunk. 387 */ 388 replace_chunk(new, chunk); 389 spin_unlock(&hash_lock); 390 fsnotify_group_unlock(audit_tree_group); 391 audit_mark_put_chunk(chunk); 392 return; 393 394 out_mutex: 395 fsnotify_group_unlock(audit_tree_group); 396 } 397 398 /* Call with group->mark_mutex held, releases it */ 399 static int create_chunk(struct inode *inode, struct audit_tree *tree) 400 { 401 struct fsnotify_mark *mark; 402 struct audit_chunk *chunk = alloc_chunk(1); 403 404 if (!chunk) { 405 fsnotify_group_unlock(audit_tree_group); 406 return -ENOMEM; 407 } 408 409 mark = alloc_mark(); 410 if (!mark) { 411 fsnotify_group_unlock(audit_tree_group); 412 kfree(chunk); 413 return -ENOMEM; 414 } 415 416 if (fsnotify_add_inode_mark_locked(mark, inode, 0)) { 417 fsnotify_group_unlock(audit_tree_group); 418 fsnotify_put_mark(mark); 419 kfree(chunk); 420 return -ENOSPC; 421 } 422 423 spin_lock(&hash_lock); 424 if (tree->goner) { 425 spin_unlock(&hash_lock); 426 fsnotify_detach_mark(mark); 427 fsnotify_group_unlock(audit_tree_group); 428 fsnotify_free_mark(mark); 429 fsnotify_put_mark(mark); 430 kfree(chunk); 431 return 0; 432 } 433 replace_mark_chunk(mark, chunk); 434 chunk->owners[0].index = (1U << 31); 435 chunk->owners[0].owner = tree; 436 get_tree(tree); 437 list_add(&chunk->owners[0].list, &tree->chunks); 438 if (!tree->root) { 439 tree->root = chunk; 440 list_add(&tree->same_root, &chunk->trees); 441 } 442 chunk->key = inode_to_key(inode); 443 /* 444 * Inserting into the hash table has to go last as once we do that RCU 445 * readers can see the chunk. 446 */ 447 insert_hash(chunk); 448 spin_unlock(&hash_lock); 449 fsnotify_group_unlock(audit_tree_group); 450 /* 451 * Drop our initial reference. When mark we point to is getting freed, 452 * we get notification through ->freeing_mark callback and cleanup 453 * chunk pointing to this mark. 454 */ 455 fsnotify_put_mark(mark); 456 return 0; 457 } 458 459 /* the first tagged inode becomes root of tree */ 460 static int tag_chunk(struct inode *inode, struct audit_tree *tree) 461 { 462 struct fsnotify_mark *mark; 463 struct audit_chunk *chunk, *old; 464 struct audit_node *p; 465 int n; 466 467 fsnotify_group_lock(audit_tree_group); 468 mark = fsnotify_find_inode_mark(inode, audit_tree_group); 469 if (!mark) 470 return create_chunk(inode, tree); 471 472 /* 473 * Found mark is guaranteed to be attached and mark_mutex protects mark 474 * from getting detached and thus it makes sure there is chunk attached 475 * to the mark. 476 */ 477 /* are we already there? */ 478 spin_lock(&hash_lock); 479 old = mark_chunk(mark); 480 for (n = 0; n < old->count; n++) { 481 if (old->owners[n].owner == tree) { 482 spin_unlock(&hash_lock); 483 fsnotify_group_unlock(audit_tree_group); 484 fsnotify_put_mark(mark); 485 return 0; 486 } 487 } 488 spin_unlock(&hash_lock); 489 490 chunk = alloc_chunk(old->count + 1); 491 if (!chunk) { 492 fsnotify_group_unlock(audit_tree_group); 493 fsnotify_put_mark(mark); 494 return -ENOMEM; 495 } 496 497 spin_lock(&hash_lock); 498 if (tree->goner) { 499 spin_unlock(&hash_lock); 500 fsnotify_group_unlock(audit_tree_group); 501 fsnotify_put_mark(mark); 502 kfree(chunk); 503 return 0; 504 } 505 p = &chunk->owners[chunk->count - 1]; 506 p->index = (chunk->count - 1) | (1U<<31); 507 p->owner = tree; 508 get_tree(tree); 509 list_add(&p->list, &tree->chunks); 510 if (!tree->root) { 511 tree->root = chunk; 512 list_add(&tree->same_root, &chunk->trees); 513 } 514 /* 515 * This has to go last when updating chunk as once replace_chunk() is 516 * called, new RCU readers can see the new chunk. 517 */ 518 replace_chunk(chunk, old); 519 spin_unlock(&hash_lock); 520 fsnotify_group_unlock(audit_tree_group); 521 fsnotify_put_mark(mark); /* pair to fsnotify_find_mark */ 522 audit_mark_put_chunk(old); 523 524 return 0; 525 } 526 527 static void audit_tree_log_remove_rule(struct audit_context *context, 528 struct audit_krule *rule) 529 { 530 struct audit_buffer *ab; 531 532 if (!audit_enabled) 533 return; 534 ab = audit_log_start(context, GFP_KERNEL, AUDIT_CONFIG_CHANGE); 535 if (unlikely(!ab)) 536 return; 537 audit_log_format(ab, "op=remove_rule dir="); 538 audit_log_untrustedstring(ab, rule->tree->pathname); 539 audit_log_key(ab, rule->filterkey); 540 audit_log_format(ab, " list=%d res=1", rule->listnr); 541 audit_log_end(ab); 542 } 543 544 static void kill_rules(struct audit_context *context, struct audit_tree *tree) 545 { 546 struct audit_krule *rule, *next; 547 struct audit_entry *entry; 548 bool need_sync = false; 549 550 list_for_each_entry_safe(rule, next, &tree->rules, rlist) { 551 entry = container_of(rule, struct audit_entry, rule); 552 553 if (rule->tree) { 554 /* not a half-baked one */ 555 audit_tree_log_remove_rule(context, rule); 556 rule->tree = NULL; 557 list_del_rcu(&entry->list); 558 list_del(&entry->rule.list); 559 if (entry->rule.exe) 560 need_sync = true; 561 audit_rule_unaccount(rule); 562 } else { 563 list_del_init(&rule->rlist); 564 } 565 } 566 567 if (list_empty(&tree->rules)) 568 return; 569 570 if (need_sync) 571 synchronize_rcu(); 572 573 list_for_each_entry_safe(rule, next, &tree->rules, rlist) { 574 entry = container_of(rule, struct audit_entry, rule); 575 576 list_del_init(&rule->rlist); 577 if (entry->rule.exe) 578 audit_remove_mark(entry->rule.exe); 579 call_rcu(&entry->rcu, audit_free_rule_rcu); 580 } 581 } 582 583 /* 584 * Remove tree from chunks. If 'tagged' is set, remove tree only from tagged 585 * chunks. The function expects tagged chunks are all at the beginning of the 586 * chunks list. 587 */ 588 static void prune_tree_chunks(struct audit_tree *victim, bool tagged) 589 { 590 spin_lock(&hash_lock); 591 while (!list_empty(&victim->chunks)) { 592 struct audit_node *p; 593 struct audit_chunk *chunk; 594 struct fsnotify_mark *mark; 595 596 p = list_first_entry(&victim->chunks, struct audit_node, list); 597 /* have we run out of marked? */ 598 if (tagged && !(p->index & (1U<<31))) 599 break; 600 chunk = find_chunk(p); 601 mark = chunk->mark; 602 remove_chunk_node(chunk, p); 603 /* Racing with audit_tree_freeing_mark()? */ 604 if (!mark) 605 continue; 606 fsnotify_get_mark(mark); 607 spin_unlock(&hash_lock); 608 609 untag_chunk(chunk, mark); 610 fsnotify_put_mark(mark); 611 612 spin_lock(&hash_lock); 613 } 614 spin_unlock(&hash_lock); 615 } 616 617 /* 618 * finish killing struct audit_tree 619 */ 620 static void prune_one(struct audit_tree *victim) 621 { 622 prune_tree_chunks(victim, false); 623 put_tree(victim); 624 } 625 626 /* trim the uncommitted chunks from tree */ 627 628 static void trim_marked(struct audit_tree *tree) 629 { 630 struct list_head *p, *q; 631 spin_lock(&hash_lock); 632 if (tree->goner) { 633 spin_unlock(&hash_lock); 634 return; 635 } 636 /* reorder */ 637 for (p = tree->chunks.next; p != &tree->chunks; p = q) { 638 struct audit_node *node = list_entry(p, struct audit_node, list); 639 q = p->next; 640 if (node->index & (1U<<31)) { 641 list_del_init(p); 642 list_add(p, &tree->chunks); 643 } 644 } 645 spin_unlock(&hash_lock); 646 647 prune_tree_chunks(tree, true); 648 649 spin_lock(&hash_lock); 650 if (!tree->root && !tree->goner) { 651 tree->goner = 1; 652 spin_unlock(&hash_lock); 653 mutex_lock(&audit_filter_mutex); 654 kill_rules(audit_context(), tree); 655 list_del_init(&tree->list); 656 mutex_unlock(&audit_filter_mutex); 657 prune_one(tree); 658 } else { 659 spin_unlock(&hash_lock); 660 } 661 } 662 663 static void audit_schedule_prune(void); 664 665 /* called with audit_filter_mutex */ 666 int audit_remove_tree_rule(struct audit_krule *rule) 667 { 668 struct audit_tree *tree; 669 tree = rule->tree; 670 if (tree) { 671 spin_lock(&hash_lock); 672 list_del_init(&rule->rlist); 673 if (list_empty(&tree->rules) && !tree->goner) { 674 tree->root = NULL; 675 list_del_init(&tree->same_root); 676 tree->goner = 1; 677 list_move(&tree->list, &prune_list); 678 rule->tree = NULL; 679 spin_unlock(&hash_lock); 680 audit_schedule_prune(); 681 return 1; 682 } 683 rule->tree = NULL; 684 spin_unlock(&hash_lock); 685 return 1; 686 } 687 return 0; 688 } 689 690 void audit_trim_trees(void) 691 { 692 struct list_head cursor; 693 694 mutex_lock(&audit_filter_mutex); 695 list_add(&cursor, &tree_list); 696 while (cursor.next != &tree_list) { 697 struct audit_tree *tree; 698 struct path path; 699 struct audit_node *node; 700 const struct path *paths; 701 struct path array[16]; 702 int err; 703 704 tree = container_of(cursor.next, struct audit_tree, list); 705 get_tree(tree); 706 list_move(&cursor, &tree->list); 707 mutex_unlock(&audit_filter_mutex); 708 709 err = kern_path(tree->pathname, 0, &path); 710 if (err) 711 goto skip_it; 712 713 paths = collect_paths(&path, array, 16); 714 path_put(&path); 715 if (IS_ERR(paths)) 716 goto skip_it; 717 718 spin_lock(&hash_lock); 719 list_for_each_entry(node, &tree->chunks, list) { 720 struct audit_chunk *chunk = find_chunk(node); 721 /* this could be NULL if the watch is dying else where... */ 722 node->index |= 1U<<31; 723 for (const struct path *p = paths; p->dentry; p++) { 724 struct inode *inode = p->dentry->d_inode; 725 if (inode_to_key(inode) == chunk->key) { 726 node->index &= ~(1U<<31); 727 break; 728 } 729 } 730 } 731 spin_unlock(&hash_lock); 732 trim_marked(tree); 733 drop_collected_paths(paths, array); 734 skip_it: 735 put_tree(tree); 736 mutex_lock(&audit_filter_mutex); 737 } 738 list_del(&cursor); 739 mutex_unlock(&audit_filter_mutex); 740 } 741 742 int audit_make_tree(struct audit_krule *rule, char *pathname, u32 op) 743 { 744 745 if (pathname[0] != '/' || 746 (rule->listnr != AUDIT_FILTER_EXIT && 747 rule->listnr != AUDIT_FILTER_URING_EXIT) || 748 op != Audit_equal || 749 rule->inode_f || rule->watch || rule->tree) 750 return -EINVAL; 751 rule->tree = alloc_tree(pathname); 752 if (!rule->tree) 753 return -ENOMEM; 754 return 0; 755 } 756 757 void audit_put_tree(struct audit_tree *tree) 758 { 759 put_tree(tree); 760 } 761 762 static int tag_mounts(const struct path *paths, struct audit_tree *tree) 763 { 764 for (const struct path *p = paths; p->dentry; p++) { 765 int err = tag_chunk(p->dentry->d_inode, tree); 766 if (err) 767 return err; 768 } 769 return 0; 770 } 771 772 /* 773 * That gets run when evict_chunk() ends up needing to kill audit_tree. 774 * Runs from a separate thread. 775 */ 776 static int prune_tree_thread(void *unused) 777 { 778 for (;;) { 779 if (list_empty(&prune_list)) { 780 set_current_state(TASK_INTERRUPTIBLE); 781 schedule(); 782 } 783 784 audit_ctl_lock(); 785 mutex_lock(&audit_filter_mutex); 786 787 while (!list_empty(&prune_list)) { 788 struct audit_tree *victim; 789 790 victim = list_entry(prune_list.next, 791 struct audit_tree, list); 792 list_del_init(&victim->list); 793 794 mutex_unlock(&audit_filter_mutex); 795 796 prune_one(victim); 797 798 mutex_lock(&audit_filter_mutex); 799 } 800 801 mutex_unlock(&audit_filter_mutex); 802 audit_ctl_unlock(); 803 } 804 return 0; 805 } 806 807 static int audit_launch_prune(void) 808 { 809 if (prune_thread) 810 return 0; 811 prune_thread = kthread_run(prune_tree_thread, NULL, 812 "audit_prune_tree"); 813 if (IS_ERR(prune_thread)) { 814 pr_err("cannot start thread audit_prune_tree"); 815 prune_thread = NULL; 816 return -ENOMEM; 817 } 818 return 0; 819 } 820 821 /* called with audit_filter_mutex */ 822 int audit_add_tree_rule(struct audit_krule *rule) 823 { 824 struct audit_tree *seed = rule->tree, *tree; 825 struct path path; 826 struct path array[16]; 827 const struct path *paths; 828 int err; 829 830 rule->tree = NULL; 831 list_for_each_entry(tree, &tree_list, list) { 832 if (!strcmp(seed->pathname, tree->pathname)) { 833 put_tree(seed); 834 rule->tree = tree; 835 list_add(&rule->rlist, &tree->rules); 836 return 0; 837 } 838 } 839 tree = seed; 840 list_add(&tree->list, &tree_list); 841 list_add(&rule->rlist, &tree->rules); 842 /* do not set rule->tree yet */ 843 mutex_unlock(&audit_filter_mutex); 844 845 if (unlikely(!prune_thread)) { 846 err = audit_launch_prune(); 847 if (err) 848 goto Err; 849 } 850 851 err = kern_path(tree->pathname, 0, &path); 852 if (err) 853 goto Err; 854 paths = collect_paths(&path, array, 16); 855 path_put(&path); 856 if (IS_ERR(paths)) { 857 err = PTR_ERR(paths); 858 goto Err; 859 } 860 861 get_tree(tree); 862 err = tag_mounts(paths, tree); 863 drop_collected_paths(paths, array); 864 865 if (!err) { 866 struct audit_node *node; 867 spin_lock(&hash_lock); 868 list_for_each_entry(node, &tree->chunks, list) 869 node->index &= ~(1U<<31); 870 spin_unlock(&hash_lock); 871 } else { 872 trim_marked(tree); 873 goto Err; 874 } 875 876 mutex_lock(&audit_filter_mutex); 877 if (list_empty(&rule->rlist)) { 878 put_tree(tree); 879 return -ENOENT; 880 } 881 rule->tree = tree; 882 put_tree(tree); 883 884 return 0; 885 Err: 886 mutex_lock(&audit_filter_mutex); 887 list_del_init(&tree->list); 888 list_del_init(&tree->rules); 889 put_tree(tree); 890 return err; 891 } 892 893 int audit_tag_tree(char *old, char *new) 894 { 895 struct list_head cursor, barrier; 896 int failed = 0; 897 struct path path1, path2; 898 struct path array[16]; 899 const struct path *paths; 900 int err; 901 902 err = kern_path(new, 0, &path2); 903 if (err) 904 return err; 905 paths = collect_paths(&path2, array, 16); 906 path_put(&path2); 907 if (IS_ERR(paths)) 908 return PTR_ERR(paths); 909 910 err = kern_path(old, 0, &path1); 911 if (err) { 912 drop_collected_paths(paths, array); 913 return err; 914 } 915 916 mutex_lock(&audit_filter_mutex); 917 list_add(&barrier, &tree_list); 918 list_add(&cursor, &barrier); 919 920 while (cursor.next != &tree_list) { 921 struct audit_tree *tree; 922 int good_one = 0; 923 924 tree = container_of(cursor.next, struct audit_tree, list); 925 get_tree(tree); 926 list_move(&cursor, &tree->list); 927 mutex_unlock(&audit_filter_mutex); 928 929 err = kern_path(tree->pathname, 0, &path2); 930 if (!err) { 931 good_one = path_is_under(&path1, &path2); 932 path_put(&path2); 933 } 934 935 if (!good_one) { 936 put_tree(tree); 937 mutex_lock(&audit_filter_mutex); 938 continue; 939 } 940 941 failed = tag_mounts(paths, tree); 942 if (failed) { 943 put_tree(tree); 944 mutex_lock(&audit_filter_mutex); 945 break; 946 } 947 948 mutex_lock(&audit_filter_mutex); 949 spin_lock(&hash_lock); 950 if (!tree->goner) { 951 list_move(&tree->list, &tree_list); 952 } 953 spin_unlock(&hash_lock); 954 put_tree(tree); 955 } 956 957 while (barrier.prev != &tree_list) { 958 struct audit_tree *tree; 959 960 tree = container_of(barrier.prev, struct audit_tree, list); 961 get_tree(tree); 962 list_move(&tree->list, &barrier); 963 mutex_unlock(&audit_filter_mutex); 964 965 if (!failed) { 966 struct audit_node *node; 967 spin_lock(&hash_lock); 968 list_for_each_entry(node, &tree->chunks, list) 969 node->index &= ~(1U<<31); 970 spin_unlock(&hash_lock); 971 } else { 972 trim_marked(tree); 973 } 974 975 put_tree(tree); 976 mutex_lock(&audit_filter_mutex); 977 } 978 list_del(&barrier); 979 list_del(&cursor); 980 mutex_unlock(&audit_filter_mutex); 981 path_put(&path1); 982 drop_collected_paths(paths, array); 983 return failed; 984 } 985 986 987 static void audit_schedule_prune(void) 988 { 989 wake_up_process(prune_thread); 990 } 991 992 /* 993 * ... and that one is done if evict_chunk() decides to delay until the end 994 * of syscall. Runs synchronously. 995 */ 996 void audit_kill_trees(struct audit_context *context) 997 { 998 struct list_head *list = &context->killed_trees; 999 1000 audit_ctl_lock(); 1001 mutex_lock(&audit_filter_mutex); 1002 1003 while (!list_empty(list)) { 1004 struct audit_tree *victim; 1005 1006 victim = list_entry(list->next, struct audit_tree, list); 1007 kill_rules(context, victim); 1008 list_del_init(&victim->list); 1009 1010 mutex_unlock(&audit_filter_mutex); 1011 1012 prune_one(victim); 1013 1014 mutex_lock(&audit_filter_mutex); 1015 } 1016 1017 mutex_unlock(&audit_filter_mutex); 1018 audit_ctl_unlock(); 1019 } 1020 1021 /* 1022 * Here comes the stuff asynchronous to auditctl operations 1023 */ 1024 1025 static void evict_chunk(struct audit_chunk *chunk) 1026 { 1027 struct audit_tree *owner; 1028 struct list_head *postponed = audit_killed_trees(); 1029 int need_prune = 0; 1030 int n; 1031 1032 mutex_lock(&audit_filter_mutex); 1033 spin_lock(&hash_lock); 1034 while (!list_empty(&chunk->trees)) { 1035 owner = list_entry(chunk->trees.next, 1036 struct audit_tree, same_root); 1037 owner->goner = 1; 1038 owner->root = NULL; 1039 list_del_init(&owner->same_root); 1040 spin_unlock(&hash_lock); 1041 if (!postponed) { 1042 kill_rules(audit_context(), owner); 1043 list_move(&owner->list, &prune_list); 1044 need_prune = 1; 1045 } else { 1046 list_move(&owner->list, postponed); 1047 } 1048 spin_lock(&hash_lock); 1049 } 1050 list_del_rcu(&chunk->hash); 1051 for (n = 0; n < chunk->count; n++) 1052 list_del_init(&chunk->owners[n].list); 1053 spin_unlock(&hash_lock); 1054 mutex_unlock(&audit_filter_mutex); 1055 if (need_prune) 1056 audit_schedule_prune(); 1057 } 1058 1059 static int audit_tree_handle_event(struct fsnotify_mark *mark, u32 mask, 1060 struct inode *inode, struct inode *dir, 1061 const struct qstr *file_name, u32 cookie) 1062 { 1063 return 0; 1064 } 1065 1066 static void audit_tree_freeing_mark(struct fsnotify_mark *mark, 1067 struct fsnotify_group *group) 1068 { 1069 struct audit_chunk *chunk; 1070 1071 fsnotify_group_lock(mark->group); 1072 spin_lock(&hash_lock); 1073 chunk = mark_chunk(mark); 1074 replace_mark_chunk(mark, NULL); 1075 spin_unlock(&hash_lock); 1076 fsnotify_group_unlock(mark->group); 1077 if (chunk) { 1078 evict_chunk(chunk); 1079 audit_mark_put_chunk(chunk); 1080 } 1081 1082 /* 1083 * We are guaranteed to have at least one reference to the mark from 1084 * either the inode or the caller of fsnotify_destroy_mark(). 1085 */ 1086 BUG_ON(refcount_read(&mark->refcnt) < 1); 1087 } 1088 1089 static const struct fsnotify_ops audit_tree_ops = { 1090 .handle_inode_event = audit_tree_handle_event, 1091 .freeing_mark = audit_tree_freeing_mark, 1092 .free_mark = audit_tree_destroy_watch, 1093 }; 1094 1095 static int __init audit_tree_init(void) 1096 { 1097 int i; 1098 1099 audit_tree_mark_cachep = KMEM_CACHE(audit_tree_mark, SLAB_PANIC); 1100 1101 audit_tree_group = fsnotify_alloc_group(&audit_tree_ops, 0); 1102 if (IS_ERR(audit_tree_group)) 1103 audit_panic("cannot initialize fsnotify group for rectree watches"); 1104 1105 for (i = 0; i < HASH_SIZE; i++) 1106 INIT_LIST_HEAD(&chunk_hash_heads[i]); 1107 1108 return 0; 1109 } 1110 __initcall(audit_tree_init); 1111