Subject: [PATCH] syslog-ng: fix segment fault during service start on arm64

service start failed since segment fault on arch arm64,
syslog-ng have a submodule ivykis, from ivykis V0.42,
it use pthread_atfork, but for arm64, this symbol is
not included by libpthread, so cause segment fault.

refer systemd, replace pthread_atfork with __register_atfork
to fix this problem.

I have create an issue, and this proposal to upstream.
https://github.com/buytenh/ivykis/issues/15

Upstream-Status: Pending

Signed-off-by: Changqing Li <changqing.li@windriver.com>

Update for 3.24.1.
Signed-off-by: Zheng Ruoqin <zhengrq.fnst@cn.fujitsu.com>
---
 lib/ivykis/src/pthr.h | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/lib/ivykis/src/pthr.h b/lib/ivykis/src/pthr.h
index 29e4be7..5d29096 100644
--- a/lib/ivykis/src/pthr.h
+++ b/lib/ivykis/src/pthr.h
@@ -24,6 +24,16 @@
 #include <pthread.h>
 #include <signal.h>
 
+#ifdef __GLIBC__
+/* We use glibc __register_atfork() + __dso_handle directly here, as they are not included in the glibc
+ * headers. __register_atfork() is mostly equivalent to pthread_atfork(), but doesn't require us to link against
+ * libpthread, as it is part of glibc anyway. */
+extern int __register_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void), void * __dso_handle);
+extern void* __dso_handle __attribute__ ((__weak__));
+#else
+#define __register_atfork(prepare,parent,child,dso) pthread_atfork(prepare,parent,child)
+#endif
+
 #ifdef HAVE_PRAGMA_WEAK
 #pragma weak pthread_create
 #endif
@@ -36,16 +46,7 @@ static inline int pthreads_available(void)
 
 #ifdef HAVE_PRAGMA_WEAK
 
-/*
- * On Linux, pthread_atfork() is defined in libc_nonshared.a (for
- * glibc >= 2.28) or libpthread_nonshared.a (for glibc <= 2.27), and
- * we want to avoid "#pragma weak" for that symbol because that causes
- * it to be undefined even if you link lib*_nonshared.a in explicitly.
- */
-#if !defined(HAVE_LIBC_NONSHARED) && !defined(HAVE_LIBPTHREAD_NONSHARED)
-#pragma weak pthread_atfork
-#endif
-
+#pragma weak __register_atfork
 #pragma weak pthread_create
 #pragma weak pthread_detach
 #pragma weak pthread_getspecific
@@ -73,7 +74,7 @@ static inline int
 pthr_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))
 {
 	if (pthreads_available())
-		return pthread_atfork(prepare, parent, child);
+		return __register_atfork(prepare, parent, child, __dso_handle);
 
 	return ENOSYS;
 }
-- 
2.7.4

