diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-09-11 21:57:17 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-09-11 22:18:01 +0200 |
commit | b13268dc09eed68426c2e68a402c96b93f8b0fff (patch) | |
tree | 09d1dead3c66876b0be17ed29e87bd96d06aa271 /src/test | |
parent | test-mountpoint-util: use log_info() (diff) | |
download | systemd-b13268dc09eed68426c2e68a402c96b93f8b0fff.tar.xz systemd-b13268dc09eed68426c2e68a402c96b93f8b0fff.zip |
test-mountpoint-util: support running on a mount namespace with another mount on /proc
Fixes #11505.
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/test-mountpoint-util.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/test/test-mountpoint-util.c b/src/test/test-mountpoint-util.c index 92eed0be62..391e1c97ba 100644 --- a/src/test/test-mountpoint-util.c +++ b/src/test/test-mountpoint-util.c @@ -83,24 +83,36 @@ TEST(mnt_id) { HASHMAP_FOREACH_KEY(p, k, h) { int mnt_id = PTR_TO_INT(k), mnt_id2; + const char *q; r = path_get_mnt_id(p, &mnt_id2); if (r < 0) { - log_debug_errno(r, "Failed to get the mnt id of %s: %m\n", p); + log_debug_errno(r, "Failed to get the mnt id of %s: %m", p); continue; } if (mnt_id == mnt_id2) { - log_debug("mnt ids of %s is %i\n", p, mnt_id); + log_debug("mnt ids of %s is %i.", p, mnt_id); continue; } else - log_debug("mnt ids of %s are %i, %i\n", p, mnt_id, mnt_id2); - - /* The ids don't match? If so, then there are two mounts on the same path, let's check if - * that's really the case */ - char *t = hashmap_get(h, INT_TO_PTR(mnt_id2)); - log_debug("the other path for mnt id %i is %s\n", mnt_id2, t); - assert_se(path_equal(p, t)); + log_debug("mnt ids of %s are %i (from /proc/self/mountinfo), %i (from path_get_mnt_id()).", p, mnt_id, mnt_id2); + + /* The ids don't match? This can easily happen e.g. running with "unshare --mount-proc". + * See #11505. */ + assert_se(q = hashmap_get(h, INT_TO_PTR(mnt_id2))); + + assert_se((r = path_is_mount_point(p, NULL, 0)) >= 0); + if (r == 0) { + /* If the path is not a mount point anymore, then it must be a sub directory of + * the path corresponds to mnt_id2. */ + log_debug("The path %s for mnt id %i is not a mount point.", p, mnt_id2); + assert_se(!isempty(path_startswith(p, q))); + } else { + /* If the path is still a mount point, then it must be equivalent to the path + * corresponds to mnt_id2 */ + log_debug("There are multiple mounts on the same path %s.", p); + assert_se(path_equal(p, q)); + } } } |