[FFmpeg-devel] [PATCH 1/2] ffmpeg: reset tty state correctly

Ganesh Ajjanagadde gajjanagadde at gmail.com
Mon Jul 27 05:53:22 CEST 2015


tty state was not being reset upon "hard" signals (SIGSEGV etc)
This resets tty state in such situations, fixes Ticket2964

Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
---
 ffmpeg.c | 38 ++++++++++++++++++++++++++++----------
 1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 751c7d3..8b5a705 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -325,10 +325,29 @@ sigterm_handler(int sig)
     received_sigterm = sig;
     received_nb_signals++;
     term_exit_sigsafe();
-    if(received_nb_signals > 3) {
-        write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n",
-                           strlen("Received > 3 system signals, hard exiting\n"));
 
+    switch (sig) {
+        /* 2 = STDERR_FILENO */
+        case SIGSEGV:
+            write(2, "Segmentation fault, hard exiting\n",
+              strlen("Segmentation fault, hard exiting\n"));
+            abort();
+        case SIGILL:
+            write(2, "Invalid instruction, hard exiting\n",
+              strlen("Invalid instruction, hard exiting\n"));
+            abort();
+        case SIGFPE:
+            write(2, "Arithmetic exception, hard exiting\n",
+              strlen("Arithmetic exception, hard exiting\n"));
+            abort();
+            break;
+        default:
+            break;
+    }
+
+    if(received_nb_signals > 3) {
+        write(2, "Received > 3 system signals, hard exiting\n",
+          strlen("Received > 3 system signals, hard exiting\n"));
         exit(123);
     }
 }
@@ -370,11 +389,7 @@ void term_init(void)
 #if HAVE_TERMIOS_H
     if(!run_as_daemon){
         struct termios tty;
-        int istty = 1;
-#if HAVE_ISATTY
-        istty = isatty(0) && isatty(2);
-#endif
-        if (istty && tcgetattr (0, &tty) == 0) {
+        if (tcgetattr (0, &tty) == 0) {
             oldtty = tty;
             restore_tty = 1;
 
@@ -393,8 +408,11 @@ void term_init(void)
     }
 #endif
 
-    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
-    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
+    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).              */
+    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).            */
+    signal(SIGSEGV, sigterm_handler); /* Segmentation fault (ANSI).     */
+    signal(SIGILL , sigterm_handler); /* Invalid instruction (ANSI).    */
+    signal(SIGFPE , sigterm_handler); /* Arithmetic error (ANSI).       */
 #ifdef SIGXCPU
     signal(SIGXCPU, sigterm_handler);
 #endif
-- 
2.4.6



More information about the ffmpeg-devel mailing list