aboutsummaryrefslogtreecommitdiff
path: root/libbb/bb_askpass.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/bb_askpass.c')
-rw-r--r--libbb/bb_askpass.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/libbb/bb_askpass.c b/libbb/bb_askpass.c
index 65ddd5a24..cf384e52b 100644
--- a/libbb/bb_askpass.c
+++ b/libbb/bb_askpass.c
@@ -17,8 +17,6 @@
17#include <sys/ioctl.h> 17#include <sys/ioctl.h>
18 18
19#include "libbb.h" 19#include "libbb.h"
20#define PWD_BUFFER_SIZE 256
21
22 20
23/* do nothing signal handler */ 21/* do nothing signal handler */
24static void askpass_timeout(int ATTRIBUTE_UNUSED ignore) 22static void askpass_timeout(int ATTRIBUTE_UNUSED ignore)
@@ -27,18 +25,17 @@ static void askpass_timeout(int ATTRIBUTE_UNUSED ignore)
27 25
28char *bb_askpass(int timeout, const char * prompt) 26char *bb_askpass(int timeout, const char * prompt)
29{ 27{
28 static char passwd[64];
29
30 char *ret; 30 char *ret;
31 int i, size; 31 int i;
32 struct sigaction sa; 32 struct sigaction sa;
33 struct termios old, new; 33 struct termios old, new;
34 static char passwd[PWD_BUFFER_SIZE];
35 34
36 tcgetattr(STDIN_FILENO, &old); 35 tcgetattr(STDIN_FILENO, &old);
37 tcflush(STDIN_FILENO, TCIFLUSH); 36 tcflush(STDIN_FILENO, TCIFLUSH);
38 37
39 size = sizeof(passwd); 38 memset(passwd, 0, sizeof(passwd));
40 ret = passwd;
41 memset(passwd, 0, size);
42 39
43 fputs(prompt, stdout); 40 fputs(prompt, stdout);
44 fflush(stdout); 41 fflush(stdout);
@@ -55,15 +52,16 @@ char *bb_askpass(int timeout, const char * prompt)
55 alarm(timeout); 52 alarm(timeout);
56 } 53 }
57 54
58 if (read(STDIN_FILENO, passwd, size-1) <= 0) { 55 ret = NULL;
59 ret = NULL; 56 if (read(STDIN_FILENO, passwd, sizeof(passwd)-1) > 0) {
60 } else { 57 ret = passwd;
61 for(i = 0; i < size && passwd[i]; i++) { 58 i = 0;
62 if (passwd[i]== '\r' || passwd[i] == '\n') { 59 /* Last byte is guaranteed to be 0
63 passwd[i]= 0; 60 (read did not overwrite it) */
64 break; 61 do {
65 } 62 if (passwd[i] == '\r' || passwd[i] == '\n')
66 } 63 passwd[i] = 0;
64 } while (passwd[i++]);
67 } 65 }
68 66
69 if (timeout) { 67 if (timeout) {
@@ -71,8 +69,7 @@ char *bb_askpass(int timeout, const char * prompt)
71 } 69 }
72 70
73 tcsetattr(STDIN_FILENO, TCSANOW, &old); 71 tcsetattr(STDIN_FILENO, TCSANOW, &old);
74 fputs("\n", stdout); 72 puts("");
75 fflush(stdout); 73 fflush(stdout);
76 return ret; 74 return ret;
77} 75}
78