X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fplugins%2Fpassprompt.c;h=44e381501fdd6eeb8e02148ddb892cdde5384198;hp=1d885fcea53ba53fa732381ad69be3737def9ad5;hb=HEAD;hpb=7717de525ac3b730df56390c5283fe22ca184bc4 diff --git a/pppd/plugins/passprompt.c b/pppd/plugins/passprompt.c index 1d885fc..7779d51 100644 --- a/pppd/plugins/passprompt.c +++ b/pppd/plugins/passprompt.c @@ -8,17 +8,30 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ + #include #include #include +#include +#include +#include #include -#include "pppd.h" +#include +#include +#include +#include + +#include +#include +#include +#include -char pppd_version[] = VERSION; +char pppd_version[] = PPPD_VERSION; static char promptprog[PATH_MAX+1]; +static int promptprog_refused = 0; -static option_t options[] = { +static struct option options[] = { { "promptprog", o_string, promptprog, "External PAP password prompting program", OPT_STATIC, NULL, PATH_MAX }, @@ -29,10 +42,10 @@ static int promptpass(char *user, char *passwd) { int p[2]; pid_t kid; - int readgood, wstat; + int readgood, wstat, ret; ssize_t red; - if (promptprog[0] == 0 || access(promptprog, X_OK) < 0) + if (promptprog_refused || promptprog[0] == 0 || access(promptprog, X_OK) < 0) return -1; /* sorry, can't help */ if (!passwd) @@ -51,15 +64,21 @@ static int promptpass(char *user, char *passwd) if (!kid) { /* we are the child, exec the program */ char *argv[5], fdstr[32]; - sys_close(); + ppp_sys_close(); closelog(); close(p[0]); - seteuid(getuid()); - setegid(getgid()); - argv[0] = promptprog; - argv[1] = user; - argv[2] = remote_name; + ret = seteuid(getuid()); + if (ret != 0) { + warn("Couldn't set effective user id"); + } + ret = setegid(getgid()); + if (ret != 0) { + warn("Couldn't set effective user id"); + } sprintf(fdstr, "%d", p[1]); + argv[0] = promptprog; + argv[1] = strdup(user); + argv[2] = strdup(ppp_remote_name()); argv[3] = fdstr; argv[4] = 0; execv(*argv, argv); @@ -74,7 +93,7 @@ static int promptpass(char *user, char *passwd) if (red == 0) break; if (red < 0) { - if (errno == EINTR) + if (errno == EINTR && !ppp_signaled(SIGTERM)) continue; error("Can't read secret from %s: %m", promptprog); readgood = -1; @@ -82,12 +101,11 @@ static int promptpass(char *user, char *passwd) } 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 || ppp_signaled(SIGTERM)) { warn("error waiting for %s: %m", promptprog); break; } @@ -95,16 +113,25 @@ 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)) - warn("%s exited with code %d", promptprog, WEXITSTATUS(status)); - + if (WEXITSTATUS(wstat)) { + warn("%s exited with code %d", promptprog, WEXITSTATUS(wstat)); + /* code when cancel was hit in the prompt prog */ + if (WEXITSTATUS(wstat) == 128) { + promptprog_refused = 1; + } + return -1; + } return 1; } void plugin_init(void) { - add_options(options); + ppp_add_options(options); pap_passwd_hook = promptpass; +#ifdef PPP_WITH_EAPTLS + eaptls_passwd_hook = promptpass; +#endif }