]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/plugins/passprompt.c
pppd: Handle SIGINT and SIGTERM during interrupted syscalls (#148)
[ppp.git] / pppd / plugins / passprompt.c
index a579b912e70cfec5140b5396192b0e05ae3c4eb2..44e381501fdd6eeb8e02148ddb892cdde5384198 100644 (file)
@@ -14,6 +14,8 @@
 #include <syslog.h>
 #include "pppd.h"
 
+char pppd_version[] = VERSION;
+
 static char promptprog[PATH_MAX+1];
 
 static option_t options[] = {
@@ -28,7 +30,7 @@ static int promptpass(char *user, char *passwd)
     int p[2];
     pid_t kid;
     int readgood, wstat;
-    size_t red;
+    ssize_t red;
 
     if (promptprog[0] == 0 || access(promptprog, X_OK) < 0)
        return -1;      /* sorry, can't help */
@@ -48,7 +50,7 @@ static int promptpass(char *user, char *passwd)
     }
     if (!kid) {
        /* we are the child, exec the program */
-       char *argv[4], fdstr[32];
+       char *argv[5], fdstr[32];
        sys_close();
        closelog();
        close(p[0]);
@@ -72,18 +74,19 @@ static int promptpass(char *user, char *passwd)
        if (red == 0)
            break;
        if (red < 0) {
+           if (errno == EINTR && !got_sigterm)
+               continue;
            error("Can't read secret from %s: %m", promptprog);
            readgood = -1;
            break;
        }
        readgood += red;
     } while (readgood < MAXSECRETLEN - 1);
-    passwd[readgood] = 0;
     close(p[0]);
 
     /* now wait for child to exit */
     while (waitpid(kid, &wstat, 0) < 0) {
-       if (errno != EINTR) {
+       if (errno != EINTR || got_sigterm) {
            warn("error waiting for %s: %m", promptprog);
            break;
        }
@@ -91,6 +94,7 @@ static int promptpass(char *user, char *passwd)
 
     if (readgood < 0)
        return 0;
+    passwd[readgood] = 0;
     if (!WIFEXITED(wstat))
        warn("%s terminated abnormally", promptprog);
     if (WEXITSTATUS(wstat))