X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fbb_askpass.c;h=435314ea029872f6975349b84bf2ae7b004a8ba2;hb=d21f596ddb294bdb65623ba1d0e49b17d0829229;hp=097a0a290c3d7eb454ce71ca4e407a570fe5939c;hpb=ab24e18c7a32ee1637be19f239e9dd9d7c7f6534;p=oweals%2Fbusybox.git diff --git a/libbb/bb_askpass.c b/libbb/bb_askpass.c index 097a0a290..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,7 +51,9 @@ 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 @@ -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; }