]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
load-fragment: allow MountImages= with paths starting with /dev
authorTopi Miettinen <toiwoton@gmail.com>
Wed, 26 Jun 2024 19:06:41 +0000 (22:06 +0300)
committerTopi Miettinen <topimiettinen@users.noreply.github.com>
Thu, 4 Jul 2024 09:36:04 +0000 (09:36 +0000)
For MountImages=, if the source is a block device, it will most likely reside
in /dev. It should be also possible to mount a static device file system in
place of (or part of) /dev. So let's allow paths starting with /dev as an
exception for MountImages=.

src/core/load-fragment.c
src/shared/parse-helpers.c
src/shared/parse-helpers.h

index 6d38143bd7586a81b8072543f379ff849b70b710..debec0d57b5456bf6f116fa72bfde46de97186c3 100644 (file)
@@ -5397,7 +5397,7 @@ int config_parse_mount_images(
                         continue;
                 }
 
-                r = path_simplify_and_warn(sresolved, PATH_CHECK_ABSOLUTE|PATH_CHECK_NON_API_VFS, unit, filename, line, lvalue);
+                r = path_simplify_and_warn(sresolved, PATH_CHECK_ABSOLUTE|PATH_CHECK_NON_API_VFS_DEV_OK, unit, filename, line, lvalue);
                 if (r < 0)
                         continue;
 
@@ -5413,7 +5413,7 @@ int config_parse_mount_images(
                         continue;
                 }
 
-                r = path_simplify_and_warn(dresolved, PATH_CHECK_ABSOLUTE|PATH_CHECK_NON_API_VFS, unit, filename, line, lvalue);
+                r = path_simplify_and_warn(dresolved, PATH_CHECK_ABSOLUTE|PATH_CHECK_NON_API_VFS_DEV_OK, unit, filename, line, lvalue);
                 if (r < 0)
                         continue;
 
index ca6842d3631509c082678fb4c20aa9b1f673e9a3..63f592d18eeac9aef1372617ef0f5f9b0aff6203 100644 (file)
 #include "path-util.h"
 #include "utf8.h"
 
+static bool validate_api_vfs(const char *path, PathSimplifyWarnFlags flags) {
+
+        assert(path);
+
+        if ((flags & (PATH_CHECK_NON_API_VFS|PATH_CHECK_NON_API_VFS_DEV_OK)) == 0)
+                return true;
+
+        if (!path_below_api_vfs(path))
+                return true;
+
+        if (FLAGS_SET(flags, PATH_CHECK_NON_API_VFS_DEV_OK) && path_startswith(path, "/dev"))
+                return true;
+
+        return false;
+}
+
 int path_simplify_and_warn(
                 char *path,
                 PathSimplifyWarnFlags flags,
@@ -23,6 +39,7 @@ int path_simplify_and_warn(
 
         assert(path);
         assert(!FLAGS_SET(flags, PATH_CHECK_ABSOLUTE | PATH_CHECK_RELATIVE));
+        assert(!FLAGS_SET(flags, PATH_CHECK_NON_API_VFS | PATH_CHECK_NON_API_VFS_DEV_OK));
         assert(lvalue);
 
         if (!utf8_is_valid(path))
@@ -56,7 +73,7 @@ int path_simplify_and_warn(
                                   "%s= path is not normalized%s: %s",
                                   lvalue, fatal ? "" : ", ignoring", path);
 
-        if (FLAGS_SET(flags, PATH_CHECK_NON_API_VFS) && path_below_api_vfs(path))
+        if (!validate_api_vfs(path, flags))
                 return log_syntax(unit, level, filename, line, SYNTHETIC_ERRNO(EINVAL),
                                   "%s= path is below API VFS%s: %s",
                                   lvalue, fatal ? ", refusing" : ", ignoring",
index 6d1034b6dea3e65b883042309bd1da0ef8b2b262..29ab60fe9f0346ffc72179f0bd91d4d03b3ced02 100644 (file)
@@ -4,11 +4,12 @@
 #include <stdint.h>
 
 typedef enum PathSimplifyWarnFlags {
-        PATH_CHECK_FATAL         = 1 << 0,  /* If not set, then error message is appended with 'ignoring'. */
-        PATH_CHECK_ABSOLUTE      = 1 << 1,
-        PATH_CHECK_RELATIVE      = 1 << 2,
-        PATH_KEEP_TRAILING_SLASH = 1 << 3,
-        PATH_CHECK_NON_API_VFS   = 1 << 4,
+        PATH_CHECK_FATAL              = 1 << 0,  /* If not set, then error message is appended with 'ignoring'. */
+        PATH_CHECK_ABSOLUTE           = 1 << 1,
+        PATH_CHECK_RELATIVE           = 1 << 2,
+        PATH_KEEP_TRAILING_SLASH      = 1 << 3,
+        PATH_CHECK_NON_API_VFS        = 1 << 4,
+        PATH_CHECK_NON_API_VFS_DEV_OK = 1 << 5,
 } PathSimplifyWarnFlags;
 
 int path_simplify_and_warn(