From: Lennart Poettering Date: Wed, 19 Nov 2025 16:25:44 +0000 (+0100) Subject: dissect-image: add fd-based flavour of mountfsd_mount_image() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=468cfd25a02fccd3139907e39096f1a22bc59995;p=thirdparty%2Fsystemd.git dissect-image: add fd-based flavour of mountfsd_mount_image() --- diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 25041687f94..e1fa383a367 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -630,7 +630,35 @@ static void check_partition_flags( log_debug("Unexpected partition flag %llu set on %s!", bit, node); } } +#endif + +static int make_image_name(const char *path, char **ret) { + int r; + + assert(path); + assert(ret); + + _cleanup_free_ char *filename = NULL; + r = path_extract_filename(path, &filename); + if (r < 0) + return r; + + _cleanup_free_ char *name = NULL; + r = raw_strip_suffixes(filename, &name); + if (r < 0) + return r; + + if (!image_name_is_valid(name)) { + log_debug("Image name %s is not valid, ignoring.", strna(name)); + *ret = NULL; + return 0; + } + *ret = TAKE_PTR(name); + return 1; +} + +#if HAVE_BLKID static int dissected_image_new(const char *path, DissectedImage **ret) { _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL; _cleanup_free_ char *name = NULL; @@ -639,20 +667,9 @@ static int dissected_image_new(const char *path, DissectedImage **ret) { assert(ret); if (path) { - _cleanup_free_ char *filename = NULL; - - r = path_extract_filename(path, &filename); - if (r < 0) - return r; - - r = raw_strip_suffixes(filename, &name); + r = make_image_name(path, &name); if (r < 0) return r; - - if (!image_name_is_valid(name)) { - log_debug("Image name %s is not valid, ignoring.", strna(name)); - name = mfree(name); - } } m = new(DissectedImage, 1); @@ -5022,8 +5039,8 @@ static void mount_image_reply_parameters_done(MountImageReplyParameters *p) { #endif -int mountfsd_mount_image( - const char *path, +int mountfsd_mount_image_fd( + int image_fd, int userns_fd, const ImagePolicy *image_policy, const VeritySettings *verity, @@ -5043,13 +5060,13 @@ int mountfsd_mount_image( }; _cleanup_(dissected_image_unrefp) DissectedImage *di = NULL; - _cleanup_close_ int image_fd = -EBADF, verity_data_fd = -EBADF; + _cleanup_close_ int verity_data_fd = -EBADF; _cleanup_(sd_varlink_unrefp) sd_varlink *vl = NULL; _cleanup_free_ char *ps = NULL; const char *error_id; int r; - assert(path); + assert(image_fd >= 0); assert(ret); r = sd_varlink_connect_address(&vl, "/run/systemd/io.systemd.MountFileSystem"); @@ -5064,10 +5081,6 @@ int mountfsd_mount_image( if (r < 0) return log_error_errno(r, "Failed to enable varlink fd passing for write: %m"); - image_fd = open(path, O_RDONLY|O_CLOEXEC); - if (image_fd < 0) - return log_error_errno(errno, "Failed to open '%s': %m", path); - r = sd_varlink_push_dup_fd(vl, image_fd); if (r < 0) return log_error_errno(r, "Failed to push image fd into varlink connection: %m"); @@ -5159,7 +5172,7 @@ int mountfsd_mount_image( assert(pp.designator >= 0); if (!di) { - r = dissected_image_new(path, &di); + r = dissected_image_new(/* path= */ NULL, &di); if (r < 0) return log_error_errno(r, "Failed to allocated new dissected image structure: %m"); } @@ -5194,6 +5207,39 @@ int mountfsd_mount_image( #endif } +int mountfsd_mount_image( + const char *path, + int userns_fd, + const ImagePolicy *image_policy, + const VeritySettings *verity, + DissectImageFlags flags, + DissectedImage **ret) { + + int r; + + assert(path); + assert(verity); + assert(ret); + + _cleanup_close_ int image_fd = open(path, O_RDONLY|O_CLOEXEC); + if (image_fd < 0) + return log_error_errno(errno, "Failed to open '%s': %m", path); + + _cleanup_(dissected_image_unrefp) DissectedImage *di = NULL; + r = mountfsd_mount_image_fd(image_fd, userns_fd, image_policy, verity, flags, &di); + if (r < 0) + return r; + + if (!di->image_name) { + r = make_image_name(path, &di->image_name); + if (r < 0) + return r; + } + + *ret = TAKE_PTR(di); + return 0; +} + int mountfsd_mount_directory_fd( int directory_fd, int userns_fd, diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index 9650dce2a49..a07bd907ae6 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -268,6 +268,7 @@ static inline const char* dissected_partition_fstype(const DissectedPartition *m int get_common_dissect_directory(char **ret); +int mountfsd_mount_image_fd(int image_fd, int userns_fd, const ImagePolicy *image_policy, const VeritySettings *verity, DissectImageFlags flags, DissectedImage **ret); int mountfsd_mount_image(const char *path, int userns_fd, const ImagePolicy *image_policy, const VeritySettings *verity, DissectImageFlags flags, DissectedImage **ret); int mountfsd_mount_directory_fd(int directory_fd, int userns_fd, DissectImageFlags flags, int *ret_mount_fd); int mountfsd_mount_directory(const char *path, int userns_fd, DissectImageFlags flags, int *ret_mount_fd);