remove longjmp from signal handler in mhl
authorPhilipp Takacs <philipp@bureaucracy.de>
Sat, 21 Feb 2015 11:09:33 +0000 (12:09 +0100)
committerPhilipp Takacs <philipp@bureaucracy.de>
Sun, 22 Feb 2015 22:19:11 +0000 (23:19 +0100)
To avoid undefined behavior set an interrupt flag
in the signal handler.

uip/mhl.c

index 5403673..09fa366 100644 (file)
--- a/uip/mhl.c
+++ b/uip/mhl.c
@@ -12,7 +12,6 @@
 #include <h/fmt_scan.h>
 #include <h/tws.h>
 #include <h/utils.h>
-#include <setjmp.h>
 #include <signal.h>
 
 /*
@@ -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;
 }