Zubicaray reported a bug in vi that causes it to eat 100% cpu when you close
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.
This commit is contained in:
parent
b049c0ec19
commit
2d6af16035
87
editors/vi.c
87
editors/vi.c
@ -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
|
||||
@ -30,50 +22,20 @@
|
||||
* 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))
|
||||
@ -81,10 +43,6 @@
|
||||
#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
|
||||
|
Loading…
Reference in New Issue
Block a user