Lines Matching +full:0 +full:a
27 #define CLONE_NEWNS 0x00020000
31 #define CLONE_NEWUSER 0x10000000
47 #define MOUNT_ATTR_RDONLY 0x00000001
51 #define MOUNT_ATTR_NOSUID 0x00000002
55 #define MOUNT_ATTR_NOEXEC 0x00000008
59 #define MOUNT_ATTR_NODIRATIME 0x00000080
63 #define MOUNT_ATTR__ATIME 0x00000070
67 #define MOUNT_ATTR_RELATIME 0x00000000
71 #define MOUNT_ATTR_NOATIME 0x00000010
75 #define MOUNT_ATTR_STRICTATIME 0x00000020
79 #define AT_RECURSIVE 0x8000
151 #define MOUNT_ATTR_IDMAP 0x00100000
155 #define MOUNT_ATTR_NOSYMFOLLOW 0x00200000
173 #define AT_RECURSIVE 0x8000 /* Apply to the entire subtree */
187 } while (ret < 0 && errno == EINTR); in write_nointr()
198 if (fd < 0) in write_file()
203 if (ret < 0 || (size_t)ret != count) in write_file()
206 return 0; in write_file()
225 snprintf(map, sizeof(map), "0 %d 1", uid); in create_and_enter_userns()
230 snprintf(map, sizeof(map), "0 %d 1", gid); in create_and_enter_userns()
234 if (setgid(0)) in create_and_enter_userns()
237 if (setuid(0)) in create_and_enter_userns()
240 return 0; in create_and_enter_userns()
251 if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, 0)) in prepare_unpriv_mountns()
254 return 0; in prepare_unpriv_mountns()
258 #define ST_NOSYMFOLLOW 0x2000 /* do not follow symlinks */
268 if (ret != 0) in read_mnt_flags()
276 mnt_flags = 0; in read_mnt_flags()
306 for (i = 0; i < nfields; i++) { in get_field()
323 *word = '\0'; in null_endofword()
328 size_t len = 0; in is_shared_mount()
349 if (strcmp(target, path) != 0) in is_shared_mount()
367 .attr_clr = 0, in mount_setattr_thread()
371 if (sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr))) in mount_setattr_thread()
374 pthread_exit(int_to_ptr(0)); in mount_setattr_thread()
386 ret = sys_mount_setattr(-EBADF, "", AT_EMPTY_PATH, NULL, 0); in mount_setattr_supported()
387 if (ret < 0 && errno == ENOSYS) in mount_setattr_supported()
396 #define NOSYMFOLLOW_TARGET "/mnt/A/AA/data"
397 #define NOSYMFOLLOW_SYMLINK "/mnt/A/AA/symlink"
406 ASSERT_EQ(prepare_unpriv_mountns(), 0); in FIXTURE_SETUP()
412 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
414 ASSERT_EQ(mkdir("/tmp/B", 0777), 0); in FIXTURE_SETUP()
417 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
419 ASSERT_EQ(mkdir("/tmp/B/BB", 0777), 0); in FIXTURE_SETUP()
421 ASSERT_EQ(mkdir("/tmp/target1", 0777), 0); in FIXTURE_SETUP()
423 ASSERT_EQ(mkdir("/tmp/target2", 0777), 0); in FIXTURE_SETUP()
426 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
429 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
431 ASSERT_EQ(mkdir("/mnt/A", 0777), 0); in FIXTURE_SETUP()
433 ASSERT_EQ(mount("testing", "/mnt/A", "tmpfs", MS_NOATIME | MS_NODEV, in FIXTURE_SETUP()
434 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
436 ASSERT_EQ(mkdir("/mnt/A/AA", 0777), 0); in FIXTURE_SETUP()
438 ASSERT_EQ(mount("/tmp", "/mnt/A/AA", NULL, MS_BIND | MS_REC, NULL), 0); in FIXTURE_SETUP()
440 ASSERT_EQ(mkdir("/mnt/B", 0777), 0); in FIXTURE_SETUP()
443 MS_NOATIME | MS_NODEV | MS_NOSUID, 0), 0); in FIXTURE_SETUP()
445 ASSERT_EQ(mkdir("/mnt/B/BB", 0777), 0); in FIXTURE_SETUP()
448 MS_RELATIME | MS_NOEXEC | MS_RDONLY, 0), 0); in FIXTURE_SETUP()
451 ASSERT_GT(fd, 0); in FIXTURE_SETUP()
452 ASSERT_EQ(symlink(NOSYMFOLLOW_TARGET, NOSYMFOLLOW_SYMLINK), 0); in FIXTURE_SETUP()
453 ASSERT_EQ(close(fd), 0); in FIXTURE_SETUP()
461 (void)umount2("/mnt/A", MNT_DETACH); in FIXTURE_TEARDOWN()
474 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
475 sizeof(invalid_attr)), 0); in TEST_F()
477 invalid_attr.attr_set = 0; in TEST_F()
479 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
480 sizeof(invalid_attr)), 0); in TEST_F()
482 invalid_attr.attr_clr = 0; in TEST_F()
484 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
485 sizeof(invalid_attr)), 0); in TEST_F()
490 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
491 sizeof(invalid_attr)), 0); in TEST_F()
493 ASSERT_NE(sys_mount_setattr(-1, "mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
494 sizeof(invalid_attr)), 0); in TEST_F()
499 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
511 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
512 ASSERT_GT(old_flags, 0); in TEST_F()
514 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, NULL, in TEST_F()
515 sizeof(invalid_attr)), 0); in TEST_F()
518 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, (void *)s, in TEST_F()
519 sizeof(invalid_attr)), 0); in TEST_F()
522 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, 0), 0); in TEST_F()
525 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
526 sizeof(invalid_attr) / 2), 0); in TEST_F()
529 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
530 sizeof(invalid_attr) / 2), 0); in TEST_F()
533 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, in TEST_F()
534 (void *)&large_attr, sizeof(large_attr)), 0); in TEST_F()
537 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, in TEST_F()
538 (void *)&large_attr, sizeof(large_attr)), 0); in TEST_F()
540 large_attr.attr3.attr_set = 0; in TEST_F()
542 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, in TEST_F()
543 (void *)&large_attr, sizeof(large_attr)), 0); in TEST_F()
548 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
551 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
554 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
557 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
563 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
572 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
573 ASSERT_GT(old_flags, 0); in TEST_F()
575 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", 0, &attr, sizeof(attr)), 0); in TEST_F()
583 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
586 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
589 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
592 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
599 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
608 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
609 ASSERT_GT(old_flags, 0); in TEST_F()
611 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
619 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
622 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
625 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
628 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
631 memset(&attr, 0, sizeof(attr)); in TEST_F()
634 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
637 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
640 ASSERT_EQ(is_shared_mount("/mnt/A"), true); in TEST_F()
642 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
645 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), true); in TEST_F()
647 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
650 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), true); in TEST_F()
652 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
655 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), true); in TEST_F()
657 fd = open("/mnt/A/AA/B/b", O_RDWR | O_CLOEXEC | O_CREAT | O_EXCL, 0777); in TEST_F()
658 ASSERT_GE(fd, 0); in TEST_F()
661 * We're holding a fd open for writing so this needs to fail somewhere in TEST_F()
665 ASSERT_LT(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
667 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
670 ASSERT_EQ(is_shared_mount("/mnt/A"), true); in TEST_F()
672 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
675 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), true); in TEST_F()
677 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
680 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), true); in TEST_F()
682 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
685 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), true); in TEST_F()
687 EXPECT_EQ(close(fd), 0); in TEST_F()
693 unsigned int old_flags = 0, new_flags = 0; in TEST_F()
703 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
704 ASSERT_GT(old_flags, 0); in TEST_F()
706 fd = open("/mnt/A/AA/B/b", O_RDWR | O_CLOEXEC | O_CREAT | O_EXCL, 0777); in TEST_F()
707 ASSERT_GE(fd, 0); in TEST_F()
710 * We're holding a fd open to a mount somwhere in the middle so this in TEST_F()
714 ASSERT_LT(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
716 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
719 ASSERT_EQ(is_shared_mount("/mnt/A"), false); in TEST_F()
721 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
724 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), false); in TEST_F()
726 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
729 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), false); in TEST_F()
731 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
734 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), false); in TEST_F()
736 dfd = open("/mnt/A/AA/B", O_DIRECTORY | O_CLOEXEC); in TEST_F()
737 ASSERT_GE(dfd, 0); in TEST_F()
738 EXPECT_EQ(fsync(dfd), 0); in TEST_F()
739 EXPECT_EQ(close(dfd), 0); in TEST_F()
741 EXPECT_EQ(fsync(fd), 0); in TEST_F()
742 EXPECT_EQ(close(fd), 0); in TEST_F()
745 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
750 unsigned int old_flags1 = 0, old_flags2 = 0, new_flags = 0, expected_flags = 0; in TEST_F()
760 ASSERT_GT(old_flags1, 0); in TEST_F()
763 ASSERT_GT(old_flags2, 0); in TEST_F()
765 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/B", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
784 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
792 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
795 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
798 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
802 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
804 attr.attr_set = 0; in TEST_F()
806 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
809 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
811 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
812 ASSERT_GT(old_flags, 0); in TEST_F()
816 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
822 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
825 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
828 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
831 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
834 memset(&attr, 0, sizeof(attr)); in TEST_F()
838 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
843 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
846 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
849 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
852 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
855 memset(&attr, 0, sizeof(attr)); in TEST_F()
859 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
863 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
866 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
869 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
872 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
875 memset(&attr, 0, sizeof(attr)); in TEST_F()
879 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
882 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
885 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
888 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
891 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
894 memset(&attr, 0, sizeof(attr)); in TEST_F()
895 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
897 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
900 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
903 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
906 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
909 memset(&attr, 0, sizeof(attr)); in TEST_F()
911 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
915 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
918 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
921 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
924 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
930 int i, j, nthreads, ret = 0; in TEST_F()
931 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
938 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
939 ASSERT_GT(old_flags, 0); in TEST_F()
947 for (i = 0; i < nthreads; i++) in TEST_F()
948 ASSERT_EQ(pthread_create(&threads[i], &pattr, mount_setattr_thread, NULL), 0); in TEST_F()
950 for (j = 0; j < i; j++) { in TEST_F()
953 EXPECT_EQ(pthread_join(threads[j], &retptr), 0); in TEST_F()
956 EXPECT_EQ(ret, 0); in TEST_F()
960 ASSERT_EQ(ret, 0); in TEST_F()
965 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
968 ASSERT_EQ(is_shared_mount("/mnt/A"), true); in TEST_F()
970 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
973 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), true); in TEST_F()
975 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
978 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), true); in TEST_F()
980 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
983 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), true); in TEST_F()
996 EXPECT_EQ(create_and_enter_userns(), 0); in TEST_F()
997 ret = sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)); in TEST_F()
998 ASSERT_LT(ret, 0); in TEST_F()
1012 fd = open("/mnt/A", O_DIRECTORY | O_CLOEXEC); in TEST_F()
1013 ASSERT_GE(fd, 0); in TEST_F()
1015 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1018 ASSERT_LT(ret, 0); in TEST_F()
1029 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in FIXTURE_SETUP()
1031 ASSERT_EQ(mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, 0), 0); in FIXTURE_SETUP()
1037 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1039 ASSERT_EQ(mkdir("/tmp/B", 0777), 0); in FIXTURE_SETUP()
1040 ASSERT_EQ(mknodat(-EBADF, "/tmp/B/b", S_IFREG | 0644, 0), 0); in FIXTURE_SETUP()
1041 ASSERT_EQ(chown("/tmp/B/b", 0, 0), 0); in FIXTURE_SETUP()
1044 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1046 ASSERT_EQ(mkdir("/tmp/B/BB", 0777), 0); in FIXTURE_SETUP()
1047 ASSERT_EQ(mknodat(-EBADF, "/tmp/B/BB/b", S_IFREG | 0644, 0), 0); in FIXTURE_SETUP()
1048 ASSERT_EQ(chown("/tmp/B/BB/b", 0, 0), 0); in FIXTURE_SETUP()
1051 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1054 "size=2m,mode=700"), 0); in FIXTURE_SETUP()
1056 ASSERT_EQ(mkdir("/mnt/A", 0777), 0); in FIXTURE_SETUP()
1058 ASSERT_EQ(mount("testing", "/mnt/A", "tmpfs", MS_NOATIME | MS_NODEV, in FIXTURE_SETUP()
1059 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1061 ASSERT_EQ(mkdir("/mnt/A/AA", 0777), 0); in FIXTURE_SETUP()
1063 ASSERT_EQ(mount("/tmp", "/mnt/A/AA", NULL, MS_BIND | MS_REC, NULL), 0); in FIXTURE_SETUP()
1065 ASSERT_EQ(mkdir("/mnt/B", 0777), 0); in FIXTURE_SETUP()
1068 MS_NOATIME | MS_NODEV | MS_NOSUID, 0), 0); in FIXTURE_SETUP()
1070 ASSERT_EQ(mkdir("/mnt/B/BB", 0777), 0); in FIXTURE_SETUP()
1073 MS_RELATIME | MS_NOEXEC | MS_RDONLY, 0), 0); in FIXTURE_SETUP()
1075 ASSERT_EQ(mkdir("/mnt/C", 0777), 0); in FIXTURE_SETUP()
1076 ASSERT_EQ(mkdir("/mnt/D", 0777), 0); in FIXTURE_SETUP()
1078 ASSERT_GE(img_fd, 0); in FIXTURE_SETUP()
1079 ASSERT_EQ(ftruncate(img_fd, 1024 * 2048), 0); in FIXTURE_SETUP()
1080 ASSERT_EQ(system("mkfs.ext4 -q /mnt/C/ext4.img"), 0); in FIXTURE_SETUP()
1081 ASSERT_EQ(system("mount -o loop -t ext4 /mnt/C/ext4.img /mnt/D/"), 0); in FIXTURE_SETUP()
1082 ASSERT_EQ(close(img_fd), 0); in FIXTURE_SETUP()
1087 (void)umount2("/mnt/A", MNT_DETACH); in FIXTURE_TEARDOWN()
1104 ASSERT_NE(sys_mount_setattr(-1, "/", 0, &attr, sizeof(attr)), 0) { in TEST_F()
1122 ASSERT_NE(sys_mount_setattr(-1, "/", 0, &attr, sizeof(attr)), 0) { in TEST_F()
1141 ASSERT_GE(fd, 0); in TEST_F()
1142 ASSERT_GE(close(fd), 0); in TEST_F()
1145 ASSERT_NE(sys_mount_setattr(-1, "/", 0, &attr, sizeof(attr)), 0) { in TEST_F()
1167 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1170 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1171 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1173 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1174 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1193 return 0; in map_ids()
1222 ret = waitpid(pid, &status, 0); in wait_for_pid()
1243 if (pid < 0) in get_userns_fd()
1247 if (ret < 0) in get_userns_fd()
1277 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1279 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1280 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1281 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1282 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1283 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1287 * Validate that idmapping a mount is rejected if the mount's mount namespace
1307 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1309 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1311 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1312 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1314 sizeof(attr)), 0); in TEST_F()
1315 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1316 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1338 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1340 /* Changing mount properties on a detached mount. */ in TEST_F()
1341 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1342 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1344 AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1345 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1346 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1350 * Validate that a detached mount not in our mount namespace can be idmapped.
1368 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1370 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1372 /* Changing mount properties on a detached mount. */ in TEST_F()
1373 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1374 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1376 AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1377 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1378 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1400 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1402 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1403 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1405 AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1406 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1408 /* Change idmapping on a detached mount that is already idmapped. */ in TEST_F()
1409 attr.userns_fd = get_userns_fd(0, 20000, 10000); in TEST_F()
1410 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1411 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1412 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1413 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1423 if (ret < 0) in expected_uid_gid()
1439 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/b", 0, 0, 0), 0); in TEST_F()
1440 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/BB/b", 0, 0, 0), 0); in TEST_F()
1442 ASSERT_EQ(mount("testing", "/mnt/A", "ramfs", MS_NOATIME | MS_NODEV, in TEST_F()
1443 "size=100000,mode=700"), 0); in TEST_F()
1445 ASSERT_EQ(mkdir("/mnt/A/AA", 0777), 0); in TEST_F()
1447 ASSERT_EQ(mount("/tmp", "/mnt/A/AA", NULL, MS_BIND | MS_REC, NULL), 0); in TEST_F()
1449 open_tree_fd = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
1456 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1458 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1459 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1460 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1461 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1462 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1464 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/b", 0, 0, 0), 0); in TEST_F()
1465 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/BB/b", 0, 0, 0), 0); in TEST_F()
1466 ASSERT_EQ(expected_uid_gid(open_tree_fd, "B/b", 0, 0, 0), 0); in TEST_F()
1467 ASSERT_EQ(expected_uid_gid(open_tree_fd, "B/BB/b", 0, 0, 0), 0); in TEST_F()
1469 (void)umount2("/mnt/A", MNT_DETACH); in TEST_F()
1475 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
1484 ASSERT_GT(fd, 0); in TEST_F()
1485 ASSERT_EQ(close(fd), 0); in TEST_F()
1487 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
1488 ASSERT_GT(old_flags, 0); in TEST_F()
1490 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
1495 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
1498 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
1501 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
1504 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
1508 ASSERT_LT(fd, 0); in TEST_F()
1514 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
1517 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
1520 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
1523 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
1526 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
1530 ASSERT_GT(fd, 0); in TEST_F()
1531 ASSERT_EQ(close(fd), 0); in TEST_F()
1543 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1546 * |-/mnt/A testing tmpfs in TEST_F()
1547 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1548 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1549 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1552 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1554 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1556 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1558 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1561 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1565 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1571 ASSERT_EQ(statx(fd_tree_subdir, "B", 0, 0, &stx), 0); in TEST_F()
1573 ASSERT_EQ(statx(fd_tree_subdir, "B/BB", 0, 0, &stx), 0); in TEST_F()
1576 ASSERT_EQ(move_mount(fd_tree_subdir, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1582 ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, 0, &stx), 0); in TEST_F()
1584 ASSERT_EQ(statx(-EBADF, "/tmp/target1/B", 0, 0, &stx), 0); in TEST_F()
1586 ASSERT_EQ(statx(-EBADF, "/tmp/target1/B/BB", 0, 0, &stx), 0); in TEST_F()
1589 ASSERT_EQ(move_mount(fd_tree_base, "", -EBADF, "/tmp/target2", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1592 * |-/tmp/target2/A testing tmpfs in TEST_F()
1593 * | `-/tmp/target2/A/AA testing tmpfs in TEST_F()
1594 * | `-/tmp/target2/A/AA/B testing tmpfs in TEST_F()
1595 * | `-/tmp/target2/A/AA/B/BB testing tmpfs in TEST_F()
1598 ASSERT_EQ(statx(-EBADF, "/tmp/target2", 0, 0, &stx), 0); in TEST_F()
1600 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A", 0, 0, &stx), 0); in TEST_F()
1602 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA", 0, 0, &stx), 0); in TEST_F()
1604 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA/B", 0, 0, &stx), 0); in TEST_F()
1606 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1608 ASSERT_EQ(statx(-EBADF, "/tmp/target2/B", 0, 0, &stx), 0); in TEST_F()
1611 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1612 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1624 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1627 * |-/mnt/A testing tmpfs in TEST_F()
1628 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1629 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1630 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1633 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1635 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1637 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1639 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1642 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1649 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1653 ASSERT_LT(fd_tree_subdir, 0); in TEST_F()
1666 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1669 * |-/mnt/A testing tmpfs in TEST_F()
1670 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1671 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1672 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1675 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1677 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1679 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1681 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1684 EXPECT_EQ(create_and_enter_userns(), 0); in TEST_F()
1687 * The caller entered a new user namespace. They will have in TEST_F()
1689 * located in a mount namespace that is owned by an ancestor in TEST_F()
1690 * user namespace in which they hold no privilege. Creating a in TEST_F()
1693 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1697 ASSERT_LT(fd_tree_subdir, 0); in TEST_F()
1710 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1713 * |-/mnt/A testing tmpfs in TEST_F()
1714 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1715 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1716 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1719 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1721 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1723 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1725 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1728 EXPECT_EQ(prepare_unpriv_mountns(), 0); in TEST_F()
1731 * The caller entered a new mount namespace. They will have in TEST_F()
1740 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1744 ASSERT_LT(fd_tree_subdir, 0); in TEST_F()
1752 fd_context = sys_fsopen("tmpfs", 0); in TEST_F()
1753 ASSERT_GE(fd_context, 0); in TEST_F()
1755 ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0); in TEST_F()
1757 fd_tmpfs = sys_fsmount(fd_context, 0, 0); in TEST_F()
1758 ASSERT_GE(fd_tmpfs, 0); in TEST_F()
1760 EXPECT_EQ(close(fd_context), 0); in TEST_F()
1762 ASSERT_EQ(mkdirat(fd_tmpfs, "subdir", 0755), 0); in TEST_F()
1768 ASSERT_GE(fd_tree, 0); in TEST_F()
1770 EXPECT_EQ(close(fd_tmpfs), 0); in TEST_F()
1772 ASSERT_EQ(mkdirat(-EBADF, "/mnt/open_tree_subfolder", 0755), 0); in TEST_F()
1774 …RT_EQ(sys_move_mount(fd_tree, "", -EBADF, "/mnt/open_tree_subfolder", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1776 EXPECT_EQ(close(fd_tree), 0); in TEST_F()
1778 ASSERT_EQ(umount2("/mnt/open_tree_subfolder", 0), 0); in TEST_F()
1780 EXPECT_EQ(rmdir("/mnt/open_tree_subfolder"), 0); in TEST_F()
1791 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1795 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1802 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1806 ASSERT_EQ(statx(fd_tree_subdir, "A", 0, 0, &stx), 0); in TEST_F()
1813 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1814 ASSERT_EQ(statx(fd_tree_subdir, "", AT_EMPTY_PATH, 0, &stx), 0); in TEST_F()
1817 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1819 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1820 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1827 __u64 mnt_id = 0; in TEST_F()
1832 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1836 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1843 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1847 ASSERT_EQ(statx(fd_tree_subdir, "A", 0, 0, &stx), 0); in TEST_F()
1854 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1855 ASSERT_EQ(statx(fd_tree_subdir, "", AT_EMPTY_PATH, STATX_MNT_ID_UNIQUE, &stx), 0); in TEST_F()
1860 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1862 ASSERT_EQ(move_mount(fd_tree_base, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1863 ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, STATX_MNT_ID_UNIQUE, &stx), 0); in TEST_F()
1868 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1869 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1880 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1883 ASSERT_EQ(move_mount(fd_tree_base, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1885 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1891 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1892 ASSERT_EQ(statx(fd_tree_subdir, "BB", 0, 0, &stx), 0); in TEST_F()
1895 /* Not allowed to move an attached mount to a detached mount. */ in TEST_F()
1896 …mount(fd_tree_base, "", fd_tree_subdir, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1899 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1900 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1912 ASSERT_GE(fd_tree, 0); in TEST_F()
1914 ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx), 0); in TEST_F()
1915 /* We copied with AT_RECURSIVE so /mnt/A must be a mountpoint. */ in TEST_F()
1919 ASSERT_EQ(move_mount(fd_tree, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1921 ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, 0, &stx), 0); in TEST_F()
1924 ASSERT_EQ(umount2("/tmp/target1", MNT_DETACH), 0); in TEST_F()
1927 * This tests whether dissolve_on_fput() handles a NULL mount in TEST_F()
1930 EXPECT_EQ(close(fd_tree), 0); in TEST_F()
1938 * |-/mnt/A testing tmpfs in TEST_F()
1939 * `-/mnt/A/AA testing tmpfs in TEST_F()
1940 * `-/mnt/A/AA/B testing tmpfs in TEST_F()
1941 * `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1943 fd_tree1 = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
1947 ASSERT_GE(fd_tree1, 0); in TEST_F()
1956 ASSERT_GE(fd_tree2, 0); in TEST_F()
1973 …T_EQ(move_mount(fd_tree1, "", fd_tree2, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1977 * mount, i.e., it has a parent. Specifically, it now has the in TEST_F()
1984 ASSERT_NE(move_mount(fd_tree1, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1992 EXPECT_EQ(close(fd_tree1), 0); in TEST_F()
1995 * Attach the mount tree to a non-anonymous mount namespace. in TEST_F()
1998 * be freed. If it did this will trigger a UAF which will be in TEST_F()
2007 ASSERT_EQ(move_mount(fd_tree2, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2008 EXPECT_EQ(close(fd_tree2), 0); in TEST_F()
2018 * |-/mnt/A testing tmpfs in TEST_F()
2019 * `-/mnt/A/AA testing tmpfs in TEST_F()
2020 * `-/mnt/A/AA/B testing tmpfs in TEST_F()
2021 * `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
2023 fd_tree1 = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
2027 ASSERT_GE(fd_tree1, 0); in TEST_F()
2030 * Create an O_PATH file descriptors with a separate struct file in TEST_F()
2036 ASSERT_GE(fd_tree2, 0); in TEST_F()
2046 ASSERT_EQ(move_mount(fd_tree2, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2052 ASSERT_NE(move_mount(fd_tree1, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2062 * |-/mnt/A testing tmpfs in TEST_F()
2063 * `-/mnt/A/AA testing tmpfs in TEST_F()
2064 * `-/mnt/A/AA/B testing tmpfs in TEST_F()
2065 * `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
2067 fd_tree1 = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
2071 ASSERT_GE(fd_tree1, 0); in TEST_F()
2074 * Create an O_PATH file descriptors with a separate struct file that in TEST_F()
2075 * refers to a subtree of the same detached mount tree as @fd_tree1 in TEST_F()
2080 ASSERT_GE(fd_tree2, 0); in TEST_F()
2083 * This must fail as it is only possible to attach the root of a in TEST_F()
2086 ASSERT_NE(move_mount(fd_tree2, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2088 ASSERT_EQ(move_mount(fd_tree1, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2096 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
2097 ASSERT_EQ(mount(NULL, "/mnt", NULL, MS_REC | MS_SHARED, NULL), 0); in TEST_F()
2103 * |-/mnt/A testing tmpfs in TEST_F()
2104 * | `-/mnt/A/AA testing tmpfs in TEST_F()
2105 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
2106 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
2113 ASSERT_GE(fd_tree, 0); in TEST_F()
2115 ASSERT_EQ(statx(-EBADF, "/mnt/A", 0, 0, &stx1), 0); in TEST_F()
2116 ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx2), 0); in TEST_F()
2122 * information to verify that. Note that tmpfs will have a 0 in TEST_F()
2127 /* Mount a tmpfs filesystem over /mnt/A. */ in TEST_F()
2128 ASSERT_EQ(mount(NULL, "/mnt/A", "tmpfs", 0, NULL), 0); in TEST_F()
2131 ASSERT_EQ(statx(-EBADF, "/mnt/A", 0, 0, &stx3), 0); in TEST_F()
2132 ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx4), 0); in TEST_F()
2135 * A new filesystem has been mounted on top of /mnt/A which in TEST_F()
2137 * statx() that was taken from /mnt/A before the mount compared in TEST_F()
2149 * have propagated onto /mnt/A in the detached mount tree. in TEST_F()
2158 EXPECT_EQ(close(fd_tree), 0); in TEST_F()