From 8d5e61db432932faa5b2d8531ab804bb4da4791d Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 4 Dec 2023 18:21:23 +0100 Subject: [PATCH] dissect-image: fix fd leak in dissected_image_acquire_metadata() We have to go through the "finish" label to properly close all pipes in the error path, so that we don't leak them. --- src/shared/dissect-image.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 65f5e786b56..62aca296f61 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -3629,18 +3629,25 @@ int dissected_image_acquire_metadata(DissectedImage *m, DissectImageFlags extra_ r = wait_for_terminate_and_check("(sd-dissect)", child, 0); child = 0; if (r < 0) - return r; + goto finish; n = read(error_pipe[0], &v, sizeof(v)); - if (n < 0) - return -errno; - if (n == sizeof(v)) - return v; /* propagate error sent to us from child */ - if (n != 0) - return -EIO; - - if (r != EXIT_SUCCESS) - return -EPROTO; + if (n < 0) { + r = -errno; + goto finish; + } + if (n == sizeof(v)) { + r = v; /* propagate error sent to us from child */ + goto finish; + } + if (n != 0) { + r = -EIO; + goto finish; + } + if (r != EXIT_SUCCESS) { + r = -EPROTO; + goto finish; + } free_and_replace(m->hostname, hostname); m->machine_id = machine_id; -- 2.39.2