From: Lennart Poettering Date: Wed, 11 Mar 2026 15:45:10 +0000 (+0100) Subject: dissect-image: don't do path based ops on a non-path X-Git-Tag: v260-rc3~14^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e5924c6ecca2d2aaab3f80a82927a392a34cdabb;p=thirdparty%2Fsystemd.git dissect-image: don't do path based ops on a non-path Also, better use path_extract_filename() when extracting filenames from paths. Also, why void* for the 'base' parameter? --- diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 6c73a12548c..929a7dcac98 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -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;