[packages/git-core] revert commit which causes hangs with mksh; rel 2
atler
atler at pld-linux.org
Thu Apr 23 01:09:48 CEST 2026
commit 02e53bd1aa61198248be518920f3501471534216
Author: Jan Palus <atler at pld-linux.org>
Date: Thu Apr 23 01:06:41 2026 +0200
revert commit which causes hangs with mksh; rel 2
see https://lore.kernel.org/git/aekVSi4iu9YLaPLQ@rock.grzadka/T/
child-cleanup.patch | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++
git-core.spec | 4 +++-
2 files changed, 72 insertions(+), 1 deletion(-)
---
diff --git a/git-core.spec b/git-core.spec
index 25b1ae1..478deae 100644
--- a/git-core.spec
+++ b/git-core.spec
@@ -14,7 +14,7 @@ Summary: Distributed version control system focused on speed, effectivity and us
Summary(pl.UTF-8): Rozproszony system śledzenia treści skupiony na szybkości, wydajności i użyteczności
Name: git-core
Version: 2.54.0
-Release: 1
+Release: 2
License: GPL v2
Group: Development/Tools
Source0: https://www.kernel.org/pub/software/scm/git/git-%{version}.tar.xz
@@ -30,6 +30,7 @@ Patch0: %{name}-key-bindings.patch
Patch1: %{name}-sysconfdir.patch
Patch2: cherry-picked-commitlog.patch
Patch3: no-meson-test-check.patch
+Patch4: child-cleanup.patch
URL: http://git-scm.com/
BuildRequires: autoconf >= 2.59
BuildRequires: automake
@@ -453,6 +454,7 @@ Dopełnianie parametrów komendy git dla powłoki zsh.
%patch -P1 -p1
%patch -P2 -p1
%patch -P3 -p1
+%patch -P4 -p1 -R
# we build things in contrib but want to have it clean for doc purporses, too
cp -a contrib contrib-doc
diff --git a/child-cleanup.patch b/child-cleanup.patch
new file mode 100644
index 0000000..6996667
--- /dev/null
+++ b/child-cleanup.patch
@@ -0,0 +1,69 @@
+From dd3693eb0859274d62feac8047e1d486b3beaf31 Mon Sep 17 00:00:00 2001
+From: Andrew Au <cshung at gmail.com>
+Date: Thu, 12 Mar 2026 21:49:37 +0000
+Subject: [PATCH] transport-helper, connect: use clean_on_exit to reap children
+ on abnormal exit
+
+When a long-running service (e.g., a source indexer) runs as PID 1
+inside a container and repeatedly spawns git, git may in turn spawn
+child processes such as git-remote-https or ssh. If git exits abnormally
+(e.g., via exit(128) on a transport error), the normal cleanup paths
+(disconnect_helper, finish_connect) are bypassed, and these children are
+never waited on. The children are reparented to PID 1, which does not
+reap them, so they accumulate as zombies over time.
+
+Set clean_on_exit and wait_after_clean on child_process structs in both
+transport-helper.c and connect.c so that the existing run-command
+cleanup infrastructure handles reaping on any exit path. This avoids
+rolling custom atexit handlers that call finish_command(), which could
+deadlock if the child is blocked waiting for the parent to close a pipe.
+
+The clean_on_exit mechanism sends SIGTERM first, then waits, ensuring
+the child terminates promptly. It also handles signal-based exits, not
+just atexit.
+
+Signed-off-by: Andrew Au <cshung at gmail.com>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+---
+ connect.c | 4 ++++
+ transport-helper.c | 2 ++
+ 2 files changed, 6 insertions(+)
+
+diff --git a/connect.c b/connect.c
+index a02583a102..fcd35c5539 100644
+--- a/connect.c
++++ b/connect.c
+@@ -1054,6 +1054,8 @@ static struct child_process *git_proxy_connect(int fd[2], char *host)
+ strvec_push(&proxy->args, port);
+ proxy->in = -1;
+ proxy->out = -1;
++ proxy->clean_on_exit = 1;
++ proxy->wait_after_clean = 1;
+ if (start_command(proxy))
+ die(_("cannot start proxy %s"), git_proxy_command);
+ fd[0] = proxy->out; /* read from proxy stdout */
+@@ -1515,6 +1517,8 @@ struct child_process *git_connect(int fd[2], const char *url,
+ }
+ strvec_push(&conn->args, cmd.buf);
+
++ conn->clean_on_exit = 1;
++ conn->wait_after_clean = 1;
+ if (start_command(conn))
+ die(_("unable to fork"));
+
+diff --git a/transport-helper.c b/transport-helper.c
+index 4d95d84f9e..570d7c6439 100644
+--- a/transport-helper.c
++++ b/transport-helper.c
+@@ -154,6 +154,8 @@ static struct child_process *get_helper(struct transport *transport)
+
+ helper->trace2_child_class = helper->args.v[0]; /* "remote-<name>" */
+
++ helper->clean_on_exit = 1;
++ helper->wait_after_clean = 1;
+ code = start_command(helper);
+ if (code < 0 && errno == ENOENT)
+ die(_("unable to find remote helper for '%s'"), data->name);
+--
+2.54.0
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/git-core.git/commitdiff/02e53bd1aa61198248be518920f3501471534216
More information about the pld-cvs-commit
mailing list