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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxx

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;

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux