packages/multimedia/motion/patches/100-musl-compat.patch
Jo-Philipp Wich 926b68c15d motion: fix segmentation fault under musl libc
During startup, motion calls pthread_getspecific() through motion_log()
before pthread_key_create() has been called yet. This works on glibc and
uclibc but segfaults on musl because motion is relying on undefined
behaviour here.

Move the pthread initialization before motion_startup() so that
tls_key_threadnr is initialized when motion_log() is called.

Also enforce the use of strerror_r() on musl by defining XSI_STRERROR_R
on all non-glibc systems because the supposed replacement code is broken
and crashes on musl.

References:
http://www.lavrsen.dk/foswiki/bin/view/Motion/BugReport2015x09x30x203633

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
2015-10-08 02:15:28 +02:00

49 lines
1.7 KiB
Diff

--- a/motion.c
+++ b/motion.c
@@ -2630,6 +2630,17 @@ int main (int argc, char **argv)
struct sigaction sigchild_action;
setup_signals(&sig_handler_action, &sigchild_action);
+ /*
+ * Create and a thread attribute for the threads we spawn later on.
+ * PTHREAD_CREATE_DETACHED means to create threads detached, i.e.
+ * their termination cannot be synchronized through 'pthread_join'.
+ */
+ pthread_attr_init(&thread_attr);
+ pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
+
+ /* Create the TLS key for thread number. */
+ pthread_key_create(&tls_key_threadnr, NULL);
+
motion_startup(1, argc, argv);
#ifdef HAVE_FFMPEG
@@ -2648,17 +2659,6 @@ int main (int argc, char **argv)
if (cnt_list[0]->conf.setup_mode)
MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, "%s: Motion running in setup mode.");
- /*
- * Create and a thread attribute for the threads we spawn later on.
- * PTHREAD_CREATE_DETACHED means to create threads detached, i.e.
- * their termination cannot be synchronized through 'pthread_join'.
- */
- pthread_attr_init(&thread_attr);
- pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
-
- /* Create the TLS key for thread number. */
- pthread_key_create(&tls_key_threadnr, NULL);
-
do {
if (restart) {
/*
--- a/motion.h
+++ b/motion.h
@@ -84,7 +84,7 @@
#endif
/* strerror_r() XSI vs GNU */
-#if (defined(BSD)) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
+#if (defined(BSD)) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE) || (!defined(__GLIBC__))
#define XSI_STRERROR_R
#endif