diff options
Diffstat (limited to 'net-dialup/ppp/files')
-rw-r--r-- | net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch b/net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch new file mode 100644 index 000000000000..f61e8227efe2 --- /dev/null +++ b/net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch @@ -0,0 +1,97 @@ +From a198cd83dfba6a738a4df80abd2675b4e8ee193c Mon Sep 17 00:00:00 2001 +From: Mike Frysinger <vapier@gentoo.org> +Date: Fri, 3 Jan 2020 17:19:09 +0100 +Subject: [PATCH] passwordfd: read early + +--- + pppd/plugins/passwordfd.c | 54 ++++++++++++++++++--------------------- + 1 file changed, 25 insertions(+), 29 deletions(-) + +diff --git a/pppd/plugins/passwordfd.c b/pppd/plugins/passwordfd.c +index c1f782e..13aec56 100644 +--- a/pppd/plugins/passwordfd.c ++++ b/pppd/plugins/passwordfd.c +@@ -24,11 +24,11 @@ + + char pppd_version[] = PPPD_VERSION; + +-static int passwdfd = -1; + static char save_passwd[MAXSECRETLEN]; + ++static int readpassword (char **); + static struct option options[] = { +- { "passwordfd", o_int, &passwdfd, ++ { "passwordfd", o_special, (void *)readpassword, + "Receive password on this file descriptor" }, + { NULL } + }; +@@ -38,43 +38,39 @@ static int pwfd_check (void) + return 1; + } + +-static int pwfd_passwd (char *user, char *passwd) ++static int readpassword(char **argv) + { +- int readgood, red; +- +- if (passwdfd == -1) +- return -1; ++ char *arg = *argv; ++ int passwdfd = -1; ++ int chunk, len; + +- if (passwd == NULL) +- return 1; +- +- if (passwdfd == -2) { +- strcpy (passwd, save_passwd); +- return 1; ++ if (sscanf(arg, "%d", &passwdfd) != 1 || passwdfd < 0) ++ { ++ error ("\"%s\" is not a valid file descriptor number", arg); ++ return 0; + } + +- readgood = 0; ++ len = 0; + do { +- red = read (passwdfd, passwd + readgood, MAXSECRETLEN - 1 - readgood); +- if (red == 0) +- break; +- if (red < 0) { +- error ("Can't read secret from fd\n"); +- readgood = -1; ++ chunk = read (passwdfd, save_passwd + len, MAXSECRETLEN - 1 - len); ++ if (chunk == 0) + break; ++ if (chunk < 0) { ++ error ("Can't read secret from fd %d", passwdfd); ++ return 0; + } +- readgood += red; +- } while (readgood < MAXSECRETLEN - 1); +- ++ len += chunk; ++ } while (len < MAXSECRETLEN - 1); ++ save_passwd[len] = 0; + close (passwdfd); + +- if (readgood < 0) +- return 0; +- +- passwd[readgood] = 0; +- strcpy (save_passwd, passwd); +- passwdfd = -2; ++ return 1; ++} + ++static int pwfd_passwd (char *user, char *passwd) ++{ ++ if (passwd != NULL) ++ strcpy (passwd, save_passwd); + return 1; + } + +-- +2.40.0 + |