summaryrefslogtreecommitdiff
path: root/net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch
diff options
context:
space:
mode:
Diffstat (limited to 'net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch')
-rw-r--r--net-dialup/ppp/files/ppp-2.5.0-passwordfd-read-early.patch97
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
+