1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- From b67eb5595b232c0d936d38a595544a298f99517f Mon Sep 17 00:00:00 2001
- From: Mike Frysinger <vapier@gentoo.org>
- Date: Fri, 3 Jan 2020 17:19:09 +0100
- Subject: [PATCH 09/14] 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 c3f9793..48d04b2 100644
- --- a/pppd/plugins/passwordfd.c
- +++ b/pppd/plugins/passwordfd.c
- @@ -16,11 +16,11 @@
-
- char pppd_version[] = VERSION;
-
- -static int passwdfd = -1;
- static char save_passwd[MAXSECRETLEN];
-
- +static int readpassword (char **);
- static option_t options[] = {
- - { "passwordfd", o_int, &passwdfd,
- + { "passwordfd", o_special, (void *)readpassword,
- "Receive password on this file descriptor" },
- { NULL }
- };
- @@ -30,43 +30,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.30.0
|