aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2015-10-08 02:10:22 +0200
committerJo-Philipp Wich <jow@openwrt.org>2015-10-08 02:15:28 +0200
commit926b68c15ded22a072e8223664b95ea83fec26bc (patch)
treefb0c49a047b5bf4a016de6816ac181c9bc955e73
parenta8c37348b2363d747ad6fd6da7f3cf6037e315b2 (diff)
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>
2 files changed, 51 insertions, 2 deletions
diff --git a/multimedia/motion/Makefile b/multimedia/motion/Makefile
index 412b5f90b..eeb49b183 100644
--- a/multimedia/motion/Makefile
+++ b/multimedia/motion/Makefile
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2008-2011 OpenWrt.org
+# Copyright (C) 2008-2015 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=motion
PKG_VERSION=3.4.0-20141018-$(PKG_SOURCE_VERSION)
-PKG_RELEASE:=1
+PKG_RELEASE:=2
PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
PKG_LICENSE:=GPLv2
diff --git a/multimedia/motion/patches/100-musl-compat.patch b/multimedia/motion/patches/100-musl-compat.patch
new file mode 100644
index 000000000..b788e2696
--- /dev/null
+++ b/multimedia/motion/patches/100-musl-compat.patch
@@ -0,0 +1,49 @@
+--- 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
+