From 05f672c782c2bace47027bd4c1112fd982ad2c7f Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Tue, 2 Dec 2025 09:39:13 +0100 Subject: [PATCH] portable: Use report_errno_and_exit() --- src/portable/portable.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/portable/portable.c b/src/portable/portable.c index 715344f84d..828ef703cd 100644 --- a/src/portable/portable.c +++ b/src/portable/portable.c @@ -403,7 +403,7 @@ static int portable_extract_by_path( _cleanup_(verity_settings_done) VeritySettings verity = VERITY_SETTINGS_DEFAULT; _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL; _cleanup_(rmdir_and_freep) char *tmpdir = NULL; - _cleanup_close_pair_ int seq[2] = EBADF_PAIR; + _cleanup_close_pair_ int seq[2] = EBADF_PAIR, errno_pipe_fd[2] = EBADF_PAIR; _cleanup_(pidref_done_sigkill_wait) PidRef child = PIDREF_NULL; DissectImageFlags flags = DISSECT_IMAGE_READ_ONLY | @@ -474,11 +474,15 @@ static int portable_extract_by_path( if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, seq) < 0) return log_debug_errno(errno, "Failed to allocated SOCK_SEQPACKET socket: %m"); + if (pipe2(errno_pipe_fd, O_CLOEXEC|O_NONBLOCK) < 0) + return log_debug_errno(errno, "Failed to create pipe: %m"); + r = pidref_safe_fork("(sd-dissect)", FORK_RESET_SIGNALS|FORK_DEATHSIG_SIGTERM|FORK_NEW_MOUNTNS|FORK_MOUNTNS_SLAVE|FORK_LOG, &child); if (r < 0) return r; if (r == 0) { seq[0] = safe_close(seq[0]); + errno_pipe_fd[0] = safe_close(errno_pipe_fd[0]); r = dissected_image_mount( m, @@ -489,16 +493,15 @@ static int portable_extract_by_path( flags); if (r < 0) { log_debug_errno(r, "Failed to mount dissected image: %m"); - goto child_finish; + report_errno_and_exit(errno_pipe_fd[1], r); } r = extract_now(scope, tmpdir, matches, m->image_name, path_is_extension, relax_extension_release_check, seq[1], NULL, NULL); - - child_finish: - _exit(r < 0 ? EXIT_FAILURE : EXIT_SUCCESS); + report_errno_and_exit(errno_pipe_fd[1], r); } seq[1] = safe_close(seq[1]); + errno_pipe_fd[1] = safe_close(errno_pipe_fd[1]); unit_files = hashmap_new(&portable_metadata_hash_ops); if (!unit_files) @@ -565,6 +568,13 @@ static int portable_extract_by_path( return r; pidref_done(&child); + + if (r != EXIT_SUCCESS) { + if (read(errno_pipe_fd[0], &r, sizeof(r)) == sizeof(r)) + return log_debug_errno(r, "Failed to extract portable metadata from '%s': %m", path); + + return log_debug_errno(SYNTHETIC_ERRNO(EPROTO), "Child failed."); + } } if (!os_release)