]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mountpoint-util: make path_get_mnt_id_at() work with a NULL path
authorLennart Poettering <lennart@poettering.net>
Thu, 20 Apr 2023 16:42:36 +0000 (18:42 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 25 Apr 2023 12:00:38 +0000 (14:00 +0200)
src/basic/mountpoint-util.c
src/test/test-mountpoint-util.c

index 7237930a761d00fca0b0c5a17457236853a1772e..3584f317876f533a00c84c61d8eab849b88171dd 100644 (file)
@@ -63,7 +63,7 @@ int name_to_handle_at_loop(
 
                 h->handle_bytes = n;
 
-                if (name_to_handle_at(fd, path, h, &mnt_id, flags) >= 0) {
+                if (name_to_handle_at(fd, strempty(path), h, &mnt_id, flags) >= 0) {
 
                         if (ret_handle)
                                 *ret_handle = TAKE_PTR(h);
@@ -362,11 +362,10 @@ int path_get_mnt_id_at(int dir_fd, const char *path, int *ret) {
         int r;
 
         assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
-        assert(path);
         assert(ret);
 
         if (statx(dir_fd,
-                  path,
+                  strempty(path),
                   (isempty(path) ? AT_EMPTY_PATH : AT_SYMLINK_NOFOLLOW) |
                   AT_NO_AUTOMOUNT |    /* don't trigger automounts, mnt_id is a local concept */
                   AT_STATX_DONT_SYNC,  /* don't go to the network, mnt_id is a local concept */
index f5481b5d6bfcfe080e6d4ba25ea5c9dc89542ec5..669b07810040b081b7d09efc4e6bcad5ecfa0199 100644 (file)
@@ -366,6 +366,53 @@ TEST(fstype_can_umask) {
         assert_se(!fstype_can_umask("tmpfs"));
 }
 
+TEST(path_get_mnt_id_at_null) {
+        _cleanup_close_ int root_fd = -EBADF, run_fd = -EBADF;
+        int id1, id2;
+
+        assert_se(path_get_mnt_id_at(AT_FDCWD, "/run/", &id1) >= 0);
+        assert_se(id1 > 0);
+
+        assert_se(path_get_mnt_id_at(AT_FDCWD, "/run", &id2) >= 0);
+        assert_se(id1 == id2);
+        id2 = -1;
+
+        root_fd = open("/", O_DIRECTORY|O_CLOEXEC);
+        assert_se(root_fd >= 0);
+
+        assert_se(path_get_mnt_id_at(root_fd, "/run/", &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+
+        assert_se(path_get_mnt_id_at(root_fd, "/run", &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+
+        assert_se(path_get_mnt_id_at(root_fd, "run", &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+
+        assert_se(path_get_mnt_id_at(root_fd, "run/", &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+
+        run_fd = openat(root_fd, "run", O_DIRECTORY|O_CLOEXEC);
+        assert_se(run_fd >= 0);
+
+        id2 = -1;
+        assert_se(path_get_mnt_id_at(run_fd, "", &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+
+        assert_se(path_get_mnt_id_at(run_fd, NULL, &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+
+        assert_se(path_get_mnt_id_at(run_fd, ".", &id2) >= 0);
+        assert_se(id1 = id2);
+        id2 = -1;
+}
+
 static int intro(void) {
         /* let's move into our own mount namespace with all propagation from the host turned off, so
          * that /proc/self/mountinfo is static and constant for the whole time our test runs. */