git/list[1] front-page[2] threads[3] people[4] search[5] about
 

git on AIX: daemon.c & t5570-git-daemon.sh

From
RTREIX, Tony <tony.reix@atos.net>
Date
Mar 19, 2019, 09:05 UTC
Message-ID
<DB7PR02MB46634F68900E0F81B0110AF586400@DB7PR02MB4663.eurprd02.prod.outlook.com>
In-Reply-To
<DB7PR02MB466360C2CBC44AE5FEC22CC586470@DB7PR02MB4663.eurprd02.prod.outlook.com>
Hi,
When testing version 2.21.0 of git on AIX (6.1 & 7.2), I have found an issue with daemon.c and test t5570-git-daemon.sh : within test 4, the child_handler() code gets crazy and calls itself recursively till the process crashes. We do not have a clear idea why this issue occurs. Maybe that this issue also appears on other operating  systems.
This code:
static void child_handler(int signo)
{
        signal(SIGCHLD, child_handler);
}
is the root cause and it appeared in 2008, for SysV :
    https://git.kernel.org/pub/scm/git/git.git/commit/daemon.c?id=bd7b371e9c2aeb0aaf228dc1655e8d04fca6f797

I suggest to use the attached patch git-2.21.0-SIGCHLD-handler-v3.patch, so that this issue on AIX disappears. Moreover, this code may also be useful for other operating systems. Someone should tests it on Solaris.

I have checked that this patch is OK (build & test t5570-git-daemon.sh) on Linux/Power (Fedora 28) with GCC (v8.1).
I've also checked on Linux/Power that the 21 tests of t5570-git-daemon.sh are OK when one replaces the existing code using:
    signal(SIGCHLD, child_handler);
by the code dedicated to AIX.
I mean to say that this sigaction(SIGCHLD, &sa, NULL) code could also replace on Linux the current potentially-dangerous code based on signal(SIGCHLD, child_handler).
Regards,
Tony
 
tony.reix@atos.net

ATOS / Bull SAS ATOS Expert IBM Coop Architect & Technical Leader

Office : +33 (0) 4 76 29 72 67 1 rue de Provence - 38432 Échirolles - France www.atos.net

--- ./daemon.c.ORIGIN 2019-03-18 17:53:51 +0100 +++ ./daemon.c 2019-03-18 18:00:16 +0100

@@ -943,8 +943,11 @@
 	 * Otherwise empty handler because systemcalls will get interrupted
 	 * upon signal receipt
 	 * SysV needs the handler to be rearmed
+	 * AIX does NOT like sometimes (t5570-git-daemon test 4) to rearm it.
 	 */
+#ifndef _AIX
 	signal(SIGCHLD, child_handler);
+#endif
 }
 
 static int set_reuse_addr(int sockfd)
@@ -1155,7 +1158,19 @@
 		pfd[i].events = POLLIN;
 	}
 
+#ifdef _AIX
+	/* AIX does NOT like sometimes (t5570-git-daemon test 4) to rearm the SIGCHLD handler */
+	struct sigaction sa;
+
+	bzero(&sa, sizeof(sa));
+	sa.sa_handler = child_handler;
+	sa.sa_flags   = 0;
+	sigemptyset(&sa.sa_mask);
+
+	sigaction(SIGCHLD, &sa, NULL);
+#else
 	signal(SIGCHLD, child_handler);
+#endif
 
 	for (;;) {
 		int i;
Next: Jeff King
Message 1 of 2 in “git on AIX: daemon.c & t5570-git-daemon.sh”
  1. REIX, TonyMar 19, 2019
  2. Jeff KingApr 22, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.