From: Daan De Meyer Date: Tue, 2 Dec 2025 08:39:13 +0000 (+0100) Subject: portable: Use report_errno_and_exit() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05f672c782c2bace47027bd4c1112fd982ad2c7f;p=thirdparty%2Fsystemd.git portable: Use report_errno_and_exit() --- diff --git a/src/portable/portable.c b/src/portable/portable.c index 715344f84d9..828ef703cde 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)