Zubicaray reported a bug in vi that causes it to eat 100% cpu when you close
authorRob Landley <rob@landley.net>
Wed, 21 Jun 2006 00:52:31 +0000 (00:52 -0000)
committerRob Landley <rob@landley.net>
Wed, 21 Jun 2006 00:52:31 +0000 (00:52 -0000)
an xterm it's running in.  The vi signal behavior would catch and restarts lots
of signals, like SIGHUP, that should just kill the thing.  (Leftover behavior
from when it would segfault all the time.)  Filtered out the more obviously
bad ones.  If it segfaults, we should find and fix the problem.

editors/vi.c

index df37affac9a821f8a64f2fbc1c3253958e5904f2..3937675b125ab02801b540f1d2cb2dd1120adde0 100644 (file)
@@ -6,14 +6,6 @@
  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
  */
 
-/*
- * To compile for standalone use:
- *     gcc -Wall -Os -s -DSTANDALONE -o vi vi.c
- *       or
- *     gcc -Wall -Os -s -DSTANDALONE -DCONFIG_FEATURE_VI_CRASHME -o vi vi.c            # include testing features
- *     strip vi
- */
-
 /*
  * Things To Do:
  *     EXINIT
  *     An "ex" line oriented mode- maybe using "cmdedit"
  */
 
-//----  Feature --------------  Bytes to implement
-#ifdef STANDALONE
-#define vi_main                        main
-#define CONFIG_FEATURE_VI_COLON        // 4288
-#define CONFIG_FEATURE_VI_YANKMARK     // 1408
-#define CONFIG_FEATURE_VI_SEARCH       // 1088
-#define CONFIG_FEATURE_VI_USE_SIGNALS  // 1056
-#define CONFIG_FEATURE_VI_DOT_CMD      //  576
-#define CONFIG_FEATURE_VI_READONLY     //  128
-#define CONFIG_FEATURE_VI_SETOPTS      //  576
-#define CONFIG_FEATURE_VI_SET  //  224
-#define CONFIG_FEATURE_VI_WIN_RESIZE   //  256  WIN_RESIZE
-// To test editor using CRASHME:
-//    vi -C filename
-// To stop testing, wait until all to text[] is deleted, or
-//    Ctrl-Z and kill -9 %1
-// while in the editor Ctrl-T will toggle the crashme function on and off.
-//#define CONFIG_FEATURE_VI_CRASHME            // randomly pick commands to execute
-#endif                                                 /* STANDALONE */
-
-#include <stdio.h>
-#include <stdlib.h>
+
+#include "busybox.h"
 #include <string.h>
 #include <strings.h>
-#include <termios.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <time.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <setjmp.h>
 #include <regex.h>
 #include <ctype.h>
-#include <assert.h>
 #include <errno.h>
-#include <stdarg.h>
-#ifndef STANDALONE
-#include "busybox.h"
 #define vi_Version BB_VER " " BB_BT
-#else
-#define vi_Version "standalone"
-#endif                                                 /* STANDALONE */
 
 #ifdef CONFIG_LOCALE_SUPPORT
 #define Isprint(c) isprint((c))
 #define Isprint(c) ( (c) >= ' ' && (c) != 127 && (c) != ((unsigned char)'\233') )
 #endif
 
-#ifndef TRUE
-#define TRUE                   ((int)1)
-#define FALSE                  ((int)0)
-#endif                                                 /* TRUE */
 #define MAX_SCR_COLS           BUFSIZ
 
 // Misc. non-Ascii keys that report an escape sequence
@@ -288,7 +246,6 @@ static void colon(Byte *);  // execute the "colon" mode cmds
 static void winch_sig(int);    // catch window size changes
 static void suspend_sig(int);  // catch ctrl-Z
 static void catch_sig(int);     // catch ctrl-C and alarm time-outs
-static void core_sig(int);     // catch a core dump signal
 #endif                                                 /* CONFIG_FEATURE_VI_USE_SIGNALS */
 #ifdef CONFIG_FEATURE_VI_DOT_CMD
 static void start_new_cmd_q(Byte);     // new queue for command
@@ -461,29 +418,10 @@ static void edit_file(Byte * fn)
 
 #ifdef CONFIG_FEATURE_VI_USE_SIGNALS
        catch_sig(0);
-       core_sig(0);
        signal(SIGWINCH, winch_sig);
        signal(SIGTSTP, suspend_sig);
        sig = setjmp(restart);
        if (sig != 0) {
-               const char *msg = "";
-
-               if (sig == SIGWINCH)
-                       msg = "(window resize)";
-               if (sig == SIGHUP)
-                       msg = "(hangup)";
-               if (sig == SIGINT)
-                       msg = "(interrupt)";
-               if (sig == SIGTERM)
-                       msg = "(terminate)";
-               if (sig == SIGBUS)
-                       msg = "(bus error)";
-               if (sig == SIGSEGV)
-                       msg = "(I tried to touch invalid memory)";
-               if (sig == SIGALRM)
-                       msg = "(alarm)";
-
-               psbs("-- caught signal %d %s--", sig, msg);
                screenbegin = dot = text;
        }
 #endif                                                 /* CONFIG_FEATURE_VI_USE_SIGNALS */
@@ -2165,33 +2103,10 @@ static void suspend_sig(int sig ATTRIBUTE_UNUSED)
 //----- Come here when we get a signal ---------------------------
 static void catch_sig(int sig)
 {
-       signal(SIGHUP, catch_sig);
        signal(SIGINT, catch_sig);
-       signal(SIGTERM, catch_sig);
-       signal(SIGALRM, catch_sig);
        if(sig)
                longjmp(restart, sig);
 }
-
-//----- Come here when we get a core dump signal -----------------
-static void core_sig(int sig)
-{
-       signal(SIGQUIT, core_sig);
-       signal(SIGILL, core_sig);
-       signal(SIGTRAP, core_sig);
-       signal(SIGABRT, core_sig);
-       signal(SIGFPE, core_sig);
-       signal(SIGBUS, core_sig);
-       signal(SIGSEGV, core_sig);
-#ifdef SIGSYS
-       signal(SIGSYS, core_sig);
-#endif
-
-       if(sig) {       // signaled
-               dot = bound_dot(dot);   // make sure "dot" is valid
-               longjmp(restart, sig);
-       }
-}
 #endif                                                 /* CONFIG_FEATURE_VI_USE_SIGNALS */
 
 static int mysleep(int hund)   // sleep for 'h' 1/100 seconds