]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dissect-image: don't do path based ops on a non-path
authorLennart Poettering <lennart@amutable.com>
Wed, 11 Mar 2026 15:45:10 +0000 (16:45 +0100)
committerLennart Poettering <lennart@amutable.com>
Wed, 11 Mar 2026 16:07:45 +0000 (17:07 +0100)
Also, better use path_extract_filename() when extracting filenames
from paths.

Also, why void* for the 'base' parameter?

src/shared/dissect-image.c

index 6c73a12548caf7af5d6b4d69366534a445c61055..929a7dcac98d5c0927a9c75ac636ad5c0e08c83b 100644 (file)
@@ -2951,30 +2951,24 @@ static int decrypted_image_new(DecryptedImage **ret) {
         return 0;
 }
 
-static int make_dm_name_and_node(const void *original_node, const char *suffix, char **ret_name, char **ret_node) {
-        _cleanup_free_ char *name = NULL, *node = NULL;
-        const char *base;
+static int make_dm_name_and_node(
+                const char *base,
+                const char *suffix,
+                char **ret_name,
+                char **ret_node) {
 
-        assert(original_node);
+        assert(base);
         assert(suffix);
         assert(ret_name);
         assert(ret_node);
 
-        base = strrchr(original_node, '/');
-        if (!base)
-                base = original_node;
-        else
-                base++;
-        if (isempty(base))
-                return -EINVAL;
-
-        name = strjoin(base, suffix);
+        _cleanup_free_ char *name = strjoin(base, suffix);
         if (!name)
                 return -ENOMEM;
         if (!filename_is_valid(name))
                 return -EINVAL;
 
-        node = path_join(sym_crypt_get_dir(), name);
+        _cleanup_free_ char *node = path_join(sym_crypt_get_dir(), name);
         if (!node)
                 return -ENOMEM;
 
@@ -2984,6 +2978,24 @@ static int make_dm_name_and_node(const void *original_node, const char *suffix,
         return 0;
 }
 
+static int make_dm_name_and_node_from_node(
+                const char *original_node,
+                const char *suffix,
+                char **ret_name,
+                char **ret_node) {
+
+        int r;
+
+        assert(original_node);
+
+        _cleanup_free_ char *base = NULL;
+        r = path_extract_filename(original_node, &base);
+        if (r < 0)
+                return r;
+
+        return make_dm_name_and_node(base, suffix, ret_name, ret_node);
+}
+
 static int decrypt_partition(
                 DissectedPartition *m,
                 const char *passphrase,
@@ -3015,7 +3027,7 @@ static int decrypt_partition(
         if (r < 0)
                 return r;
 
-        r = make_dm_name_and_node(m->node, "-decrypted", &name, &node);
+        r = make_dm_name_and_node_from_node(m->node, "-decrypted", &name, &node);
         if (r < 0)
                 return r;
 
@@ -3391,7 +3403,7 @@ static int verity_partition(
 
                 r = make_dm_name_and_node(root_hash_encoded, "-verity", &name, &node);
         } else
-                r = make_dm_name_and_node(m->node, "-verity", &name, &node);
+                r = make_dm_name_and_node_from_node(m->node, "-verity", &name, &node);
         if (r < 0)
                 return r;