From: Daan De Meyer Date: Thu, 22 Dec 2022 12:00:31 +0000 (+0100) Subject: dissect-image: Return mount point fd if requested X-Git-Tag: v254-rc1~1245 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a133d2c366ea0661f4c57c9ddda3e6742dfc2566;p=thirdparty%2Fsystemd.git dissect-image: Return mount point fd if requested --- diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index ef2e60962b3..aaa7e4b706a 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -625,6 +625,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_RELAX_VAR_CHECK | DISSECT_IMAGE_READ_ONLY, &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c index 914825564eb..53794d1b7a1 100644 --- a/src/boot/bootctl.c +++ b/src/boot/bootctl.c @@ -467,6 +467,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_GENERIC_ROOT | DISSECT_IMAGE_RELAX_VAR_CHECK, &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c index 8a4f31aa624..4c312d0fbb9 100644 --- a/src/coredump/coredumpctl.c +++ b/src/coredump/coredumpctl.c @@ -1366,6 +1366,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_RELAX_VAR_CHECK | DISSECT_IMAGE_VALIDATE_OS, &mounted_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 9e79f846916..5eaaff7d841 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -1389,6 +1389,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_FSCK | DISSECT_IMAGE_GROWFS, &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 0267fc6506c..e10f0b75643 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -2125,6 +2125,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_RELAX_VAR_CHECK | (arg_action == ACTION_UPDATE_CATALOG ? DISSECT_IMAGE_FSCK|DISSECT_IMAGE_GROWFS : DISSECT_IMAGE_READ_ONLY), &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/machine-id-setup/machine-id-setup-main.c b/src/machine-id-setup/machine-id-setup-main.c index 9101f4e11a7..5620bf9bafc 100644 --- a/src/machine-id-setup/machine-id-setup-main.c +++ b/src/machine-id-setup/machine-id-setup-main.c @@ -147,6 +147,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_FSCK | DISSECT_IMAGE_GROWFS, &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/partition/repart.c b/src/partition/repart.c index 272bf19431d..0e51f4d8d36 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -6429,6 +6429,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_USR_NO_ROOT | DISSECT_IMAGE_REQUIRE_ROOT, &mounted_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 210e2c7cf7d..9a4bac99a17 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -3315,6 +3315,7 @@ int mount_image_privately_interactively( const char *image, DissectImageFlags flags, char **ret_directory, + int *ret_dir_fd, LoopDevice **ret_loop_device) { _cleanup_(verity_settings_done) VeritySettings verity = VERITY_SETTINGS_DEFAULT; @@ -3388,6 +3389,16 @@ int mount_image_privately_interactively( if (r < 0) return log_error_errno(r, "Failed to relinquish DM and loopback block devices: %m"); + if (ret_dir_fd) { + _cleanup_close_ int dir_fd = -EBADF; + + dir_fd = open(created_dir, O_CLOEXEC|O_DIRECTORY); + if (dir_fd < 0) + return log_error_errno(errno, "Failed to open mount point directory: %m"); + + *ret_dir_fd = TAKE_FD(dir_fd); + } + *ret_directory = TAKE_PTR(created_dir); *ret_loop_device = TAKE_PTR(d); diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index 143d6ff501e..3efe784ee90 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -183,7 +183,7 @@ bool dissected_image_verity_candidate(const DissectedImage *image, PartitionDesi bool dissected_image_verity_ready(const DissectedImage *image, PartitionDesignator d); bool dissected_image_verity_sig_ready(const DissectedImage *image, PartitionDesignator d); -int mount_image_privately_interactively(const char *path, DissectImageFlags flags, char **ret_directory, LoopDevice **ret_loop_device); +int mount_image_privately_interactively(const char *path, DissectImageFlags flags, char **ret_directory, int *ret_dir_fd, LoopDevice **ret_loop_device); int verity_dissect_and_mount(int src_fd, const char *src, const char *dest, const MountOptions *options, const char *required_host_os_release_id, const char *required_host_os_release_version_id, const char *required_host_os_release_sysext_level, const char *required_sysext_scope); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 4732398dd79..a752c6dce49 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -1222,6 +1222,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_RELAX_VAR_CHECK | DISSECT_IMAGE_VALIDATE_OS, &mounted_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/sysupdate/sysupdate.c b/src/sysupdate/sysupdate.c index f6e89130bc3..a3d2c5a9b91 100644 --- a/src/sysupdate/sysupdate.c +++ b/src/sysupdate/sysupdate.c @@ -881,6 +881,7 @@ static int process_image( DISSECT_IMAGE_GENERIC_ROOT | DISSECT_IMAGE_REQUIRE_ROOT, &mounted_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index 3c438a38f11..70abcfa1317 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -2180,6 +2180,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_FSCK | DISSECT_IMAGE_GROWFS, &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r; diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 458aed70541..04a860c0215 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -4142,6 +4142,7 @@ static int run(int argc, char *argv[]) { DISSECT_IMAGE_FSCK | DISSECT_IMAGE_GROWFS, &unlink_dir, + /* ret_dir_fd= */ NULL, &loop_device); if (r < 0) return r;