]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
portable: Use report_errno_and_exit()
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 2 Dec 2025 08:39:13 +0000 (09:39 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 21 Jan 2026 11:03:08 +0000 (12:03 +0100)
src/portable/portable.c

index 715344f84d9501d1d14db7f0f14f5bd0efaeff97..828ef703cdea28d8874c50558d98297c52f49a4b 100644 (file)
@@ -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)