X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fbb_askpass.c;h=435314ea029872f6975349b84bf2ae7b004a8ba2;hb=d21f596ddb294bdb65623ba1d0e49b17d0829229;hp=cf384e52b9d1915b2f2275048c2b4443f898bfb5;hpb=6429aabbf14be7ce1585fb07b1edb11795dbefc2;p=oweals%2Fbusybox.git diff --git a/libbb/bb_askpass.c b/libbb/bb_askpass.c index cf384e52b..435314ea0 100644 --- a/libbb/bb_askpass.c +++ b/libbb/bb_askpass.c @@ -8,13 +8,7 @@ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -#include -#include -#include -#include -#include #include -#include #include "libbb.h" @@ -25,18 +19,22 @@ static void askpass_timeout(int ATTRIBUTE_UNUSED ignore) char *bb_askpass(int timeout, const char * prompt) { - static char passwd[64]; + /* Was static char[BIGNUM] */ + enum { sizeof_passwd = 128 }; + static char *passwd; char *ret; int i; struct sigaction sa; struct termios old, new; + if (!passwd) + passwd = xmalloc(sizeof_passwd); + memset(passwd, 0, sizeof_passwd); + tcgetattr(STDIN_FILENO, &old); tcflush(STDIN_FILENO, TCIFLUSH); - memset(passwd, 0, sizeof(passwd)); - fputs(prompt, stdout); fflush(stdout); @@ -53,14 +51,16 @@ char *bb_askpass(int timeout, const char * prompt) } ret = NULL; - if (read(STDIN_FILENO, passwd, sizeof(passwd)-1) > 0) { + /* On timeout, read will hopefully be interrupted by SIGALRM, + * and we return NULL */ + if (read(STDIN_FILENO, passwd, sizeof_passwd-1) > 0) { ret = passwd; i = 0; /* Last byte is guaranteed to be 0 (read did not overwrite it) */ do { if (passwd[i] == '\r' || passwd[i] == '\n') - passwd[i] = 0; + passwd[i] = '\0'; } while (passwd[i++]); } @@ -69,7 +69,7 @@ char *bb_askpass(int timeout, const char * prompt) } tcsetattr(STDIN_FILENO, TCSANOW, &old); - puts(""); + bb_putchar('\n'); fflush(stdout); return ret; }