]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
utils: Canonicalize paths before comparing them
authorAndrea Bolognani <abologna@redhat.com>
Thu, 13 Feb 2025 08:54:05 +0000 (09:54 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Mon, 17 Feb 2025 17:30:35 +0000 (18:30 +0100)
In virFileIsSharedFSOverride() we compare a path against a list
of overrides looking for a match.

All overrides are canonicalized ahead of time though, so e.g.
/var/run/foo will be turned into /run/foo due to /var/run being
a symlink on modern Linux systems. But the path we're trying to
match with the overrides doesn't get the same treatment, so in
this scenario the comparison will always fail.

Canonicalizing the path as well solves the issue.

Resolves: https://issues.redhat.com/browse/RHEL-79165
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/util/virfile.c

index 6ac0f4efb3f2d473940271fd1f1f88ccc90b99a1..7cab3d0cd6732fae7c680bfe623f451be3963a54 100644 (file)
@@ -3823,10 +3823,13 @@ virFileIsSharedFSOverride(const char *path,
     if (!path || path[0] != '/' || !overrides)
         return false;
 
-    if (g_strv_contains((const char *const *) overrides, path))
-        return true;
+    /* Overrides have been canonicalized ahead of time, so we need to
+     * do the same for the provided path or we'll never be able to
+     * find a match if symlinks are involved */
+    dirpath = virFileCanonicalizePath(path);
 
-    dirpath = g_strdup(path);
+    if (g_strv_contains((const char *const *) overrides, dirpath))
+        return true;
 
     /* Continue until we've scanned the entire path */
     while (p != dirpath) {