From 1b5b23b94849b18bedd458fd83741fa07d840c7b Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 15 Sep 2016 13:13:23 +0200 Subject: [PATCH] client API: remove SIGPIPE overriding code This workaround prevented that libmpv users could accidentally crash when the SIGPIPE signal was triggered by FFmpeg's OpenSSL/GnuTLS usage. But it also modifies the global signal handler state, so remove it now that this workaround is not required anymore. --- DOCS/client-api-changes.rst | 2 ++ input/ipc-unix.c | 6 ++++++ libmpv/client.h | 4 ---- player/main.c | 7 ------- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/DOCS/client-api-changes.rst b/DOCS/client-api-changes.rst index d7fbfaadf6..5c7f8d7961 100644 --- a/DOCS/client-api-changes.rst +++ b/DOCS/client-api-changes.rst @@ -37,6 +37,8 @@ API changes instead of "no-video=" you should set "video=no". - be much more permissive what API calls are allowed before mpv_initialize(). + - do not override the SIGPIPE signal handler anymore. This was done as + workaround for the FFmpeg TLS code, which has been fixed long ago. --- mpv 0.19.0 --- 1.22 - add stream_cb API for custom protocols --- mpv 0.18.1 --- diff --git a/input/ipc-unix.c b/input/ipc-unix.c index 0f4b7132e4..f5c8886a28 100644 --- a/input/ipc-unix.c +++ b/input/ipc-unix.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -97,6 +98,11 @@ static void *client_thread(void *p) { pthread_detach(pthread_self()); + // We don't use MSG_NOSIGNAL because the moldy fruit OS doesn't support it. + struct sigaction sa = { .sa_handler = SIG_IGN, .sa_flags = SA_RESTART }; + sigfillset(&sa.sa_mask); + sigaction(SIGPIPE, &sa, NULL); + int rc; struct client_arg *arg = p; diff --git a/libmpv/client.h b/libmpv/client.h index b270a6079e..74b5d66ed8 100644 --- a/libmpv/client.h +++ b/libmpv/client.h @@ -135,10 +135,6 @@ extern "C" { * (used through libass), ALSA, FFmpeg, and possibly more. * - The FPU precision must be set at least to double precision. * - On Windows, mpv will call timeBeginPeriod(1). - * - On UNIX, every mpv_initialize() call will block SIGPIPE. This is done - * because FFmpeg makes unsafe use of OpenSSL and GnuTLS, which can raise - * this signal under certain circumstances. Once these libraries (or FFmpeg) - * are fixed, libmpv will not block the signal anymore. * - On memory exhaustion, mpv will kill the process. * * Encoding of filenames diff --git a/player/main.c b/player/main.c index 8f85bea257..2f53f4daee 100644 --- a/player/main.c +++ b/player/main.c @@ -22,7 +22,6 @@ #include #include #include -#include #include "config.h" #include "mpv_talloc.h" @@ -514,12 +513,6 @@ int mp_initialize(struct MPContext *mpctx, char **options) if (opts->w32_priority > 0) SetPriorityClass(GetCurrentProcess(), opts->w32_priority); #endif -#ifndef _WIN32 - // Deal with OpenSSL and GnuTLS not using MSG_NOSIGNAL. - struct sigaction sa = { .sa_handler = SIG_IGN, .sa_flags = SA_RESTART }; - sigfillset(&sa.sa_mask); - sigaction(SIGPIPE, &sa, NULL); -#endif prepare_playlist(mpctx, mpctx->playlist);