hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/security/apparmor/mount.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * AppArmor security module
34 *
....@@ -5,16 +6,12 @@
56 *
67 * Copyright (C) 1998-2008 Novell/SUSE
78 * Copyright 2009-2017 Canonical Ltd.
8
- *
9
- * This program is free software; you can redistribute it and/or
10
- * modify it under the terms of the GNU General Public License as
11
- * published by the Free Software Foundation, version 2 of the
12
- * License.
139 */
1410
1511 #include <linux/fs.h>
1612 #include <linux/mount.h>
1713 #include <linux/namei.h>
14
+#include <uapi/linux/mount.h>
1815
1916 #include "include/apparmor.h"
2017 #include "include/audit.h"
....@@ -232,7 +229,8 @@
232229 "failed srcname match",
233230 "failed type match",
234231 "failed flags match",
235
- "failed data match"
232
+ "failed data match",
233
+ "failed perms check"
236234 };
237235
238236 /*
....@@ -287,8 +285,8 @@
287285 return 0;
288286 }
289287
290
- /* failed at end of flags match */
291
- return 4;
288
+ /* failed at perms check, don't confuse with flags match */
289
+ return 6;
292290 }
293291
294292
....@@ -411,11 +409,13 @@
411409
412410 binary = path->dentry->d_sb->s_type->fs_flags & FS_BINARY_MOUNTDATA;
413411
414
- get_buffers(buffer);
412
+ buffer = aa_get_buffer(false);
413
+ if (!buffer)
414
+ return -ENOMEM;
415415 error = fn_for_each_confined(label, profile,
416416 match_mnt(profile, path, buffer, NULL, NULL, NULL,
417417 flags, data, binary));
418
- put_buffers(buffer);
418
+ aa_put_buffer(buffer);
419419
420420 return error;
421421 }
....@@ -440,11 +440,18 @@
440440 if (error)
441441 return error;
442442
443
- get_buffers(buffer, old_buffer);
443
+ buffer = aa_get_buffer(false);
444
+ old_buffer = aa_get_buffer(false);
445
+ error = -ENOMEM;
446
+ if (!buffer || !old_buffer)
447
+ goto out;
448
+
444449 error = fn_for_each_confined(label, profile,
445450 match_mnt(profile, path, buffer, &old_path, old_buffer,
446451 NULL, flags, NULL, false));
447
- put_buffers(buffer, old_buffer);
452
+out:
453
+ aa_put_buffer(buffer);
454
+ aa_put_buffer(old_buffer);
448455 path_put(&old_path);
449456
450457 return error;
....@@ -464,11 +471,13 @@
464471 flags &= (MS_REC | MS_SILENT | MS_SHARED | MS_PRIVATE | MS_SLAVE |
465472 MS_UNBINDABLE);
466473
467
- get_buffers(buffer);
474
+ buffer = aa_get_buffer(false);
475
+ if (!buffer)
476
+ return -ENOMEM;
468477 error = fn_for_each_confined(label, profile,
469478 match_mnt(profile, path, buffer, NULL, NULL, NULL,
470479 flags, NULL, false));
471
- put_buffers(buffer);
480
+ aa_put_buffer(buffer);
472481
473482 return error;
474483 }
....@@ -491,11 +500,17 @@
491500 if (error)
492501 return error;
493502
494
- get_buffers(buffer, old_buffer);
503
+ buffer = aa_get_buffer(false);
504
+ old_buffer = aa_get_buffer(false);
505
+ error = -ENOMEM;
506
+ if (!buffer || !old_buffer)
507
+ goto out;
495508 error = fn_for_each_confined(label, profile,
496509 match_mnt(profile, path, buffer, &old_path, old_buffer,
497510 NULL, MS_MOVE, NULL, false));
498
- put_buffers(buffer, old_buffer);
511
+out:
512
+ aa_put_buffer(buffer);
513
+ aa_put_buffer(old_buffer);
499514 path_put(&old_path);
500515
501516 return error;
....@@ -536,8 +551,17 @@
536551 }
537552 }
538553
539
- get_buffers(buffer, dev_buffer);
554
+ buffer = aa_get_buffer(false);
555
+ if (!buffer) {
556
+ error = -ENOMEM;
557
+ goto out;
558
+ }
540559 if (dev_path) {
560
+ dev_buffer = aa_get_buffer(false);
561
+ if (!dev_buffer) {
562
+ error = -ENOMEM;
563
+ goto out;
564
+ }
541565 error = fn_for_each_confined(label, profile,
542566 match_mnt(profile, path, buffer, dev_path, dev_buffer,
543567 type, flags, data, binary));
....@@ -546,7 +570,10 @@
546570 match_mnt_path_str(profile, path, buffer, dev_name,
547571 type, flags, data, binary, NULL));
548572 }
549
- put_buffers(buffer, dev_buffer);
573
+
574
+out:
575
+ aa_put_buffer(buffer);
576
+ aa_put_buffer(dev_buffer);
550577 if (dev_path)
551578 path_put(dev_path);
552579
....@@ -594,10 +621,13 @@
594621 AA_BUG(!label);
595622 AA_BUG(!mnt);
596623
597
- get_buffers(buffer);
624
+ buffer = aa_get_buffer(false);
625
+ if (!buffer)
626
+ return -ENOMEM;
627
+
598628 error = fn_for_each_confined(label, profile,
599629 profile_umount(profile, &path, buffer));
600
- put_buffers(buffer);
630
+ aa_put_buffer(buffer);
601631
602632 return error;
603633 }
....@@ -670,8 +700,12 @@
670700 AA_BUG(!old_path);
671701 AA_BUG(!new_path);
672702
673
- get_buffers(old_buffer, new_buffer);
674
- target = fn_label_build(label, profile, GFP_ATOMIC,
703
+ old_buffer = aa_get_buffer(false);
704
+ new_buffer = aa_get_buffer(false);
705
+ error = -ENOMEM;
706
+ if (!old_buffer || !new_buffer)
707
+ goto out;
708
+ target = fn_label_build(label, profile, GFP_KERNEL,
675709 build_pivotroot(profile, new_path, new_buffer,
676710 old_path, old_buffer));
677711 if (!target) {
....@@ -685,11 +719,13 @@
685719 aa_put_label(target);
686720 goto out;
687721 }
722
+ aa_put_label(target);
688723 } else
689724 /* already audited error */
690725 error = PTR_ERR(target);
691726 out:
692
- put_buffers(old_buffer, new_buffer);
727
+ aa_put_buffer(old_buffer);
728
+ aa_put_buffer(new_buffer);
693729
694730 return error;
695731