]> git.ipfire.org Git - thirdparty/git.git/commitdiff
transport-helper: check dup() return in get_exporter
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Tue, 14 Jul 2026 22:48:40 +0000 (22:48 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Jul 2026 01:02:01 +0000 (18:02 -0700)
get_exporter() duplicates helper->in via dup() and stores the
result in fastexport->out. If dup() fails (fd exhaustion), it
returns -1. The child_process machinery interprets out = -1 as
"create a pipe for stdout", which would silently change the
fast-export process's output wiring: instead of sending data
back through the helper's input fd, it would write to a new pipe
that nobody reads from.

Check the return value and report the error before proceeding.

Pointed out by Coverity.

Assisted-by: Claude Opus 4.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
transport-helper.c

index 80f90eb7bace6f761b7796fa93b60d7408464b9d..31883b244ec407fb01fa8c089e8333a0ae2bc100 100644 (file)
@@ -487,6 +487,8 @@ static int get_exporter(struct transport *transport,
        /* we need to duplicate helper->in because we want to use it after
         * fastexport is done with it. */
        fastexport->out = dup(helper->in);
+       if (fastexport->out < 0)
+               return error_errno(_("could not dup helper output fd"));
        strvec_push(&fastexport->args, "fast-export");
        strvec_push(&fastexport->args, "--use-done-feature");
        strvec_push(&fastexport->args, data->signed_tags ?