From: Philipp Takacs Date: Sat, 21 Feb 2015 11:09:33 +0000 (+0100) Subject: remove longjmp from signal handler in mhl X-Git-Tag: mmh-0.2-RC1~51 X-Git-Url: http://git.marmaro.de/?a=commitdiff_plain;h=c72e2386fd126324e3b699d4b37f71a3c40f56bc;p=mmh remove longjmp from signal handler in mhl To avoid undefined behavior set an interrupt flag in the signal handler. --- diff --git a/uip/mhl.c b/uip/mhl.c index 5403673..09fa366 100644 --- a/uip/mhl.c +++ b/uip/mhl.c @@ -12,7 +12,6 @@ #include #include #include -#include #include /* @@ -174,7 +173,7 @@ static char *parptr; static int num_ignores = 0; static char *ignores[MAXARGS]; -static jmp_buf env; +volatile sig_atomic_t eflag = 0; /* ** Redefine a couple of functions. @@ -565,21 +564,19 @@ process(char *fname, int ofilen, int ofilec) FILE *fp = NULL; struct mcomp *c1; - if (setjmp(env) == 0) { - if (fname) { - fp = fopen(fname, "r"); - if (fp == NULL) { - advise(fname, "unable to open"); - exitstat++; - return; - } - } else { - fname = "(stdin)"; - fp = stdin; + if (fname) { + fp = fopen(fname, "r"); + if (fp == NULL) { + advise(fname, "unable to open"); + exitstat++; + return; } - SIGNAL(SIGINT, intrser); - mhlfile(fp, fname, ofilen, ofilec); + } else { + fname = "(stdin)"; + fp = stdin; } + SIGNAL(SIGINT, intrser); + mhlfile(fp, fname, ofilen, ofilec); SIGNAL(SIGINT, SIG_IGN); if (fp != stdin) @@ -615,7 +612,7 @@ mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) printf(">>> %s\n\n", mname); } - for (state = FLD;;) { + for (state = FLD;!eflag;) { switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) { case FLD: case FLDPLUS: @@ -1104,7 +1101,5 @@ putch(char ch) static void intrser(int i) { - discard(stdout); - putchar('\n'); - longjmp(env, DONE); + eflag = 1; }