From: Lennart Poettering Date: Mon, 4 Dec 2023 17:21:23 +0000 (+0100) Subject: dissect-image: fix fd leak in dissected_image_acquire_metadata() X-Git-Tag: v256-rc1~1503^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d5e61db432932faa5b2d8531ab804bb4da4791d;p=thirdparty%2Fsystemd.git 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. --- 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;