libbb: random hunt for statics
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 18 Jun 2007 10:35:06 +0000 (10:35 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 18 Jun 2007 10:35:06 +0000 (10:35 -0000)
function                                             old     new   delta
bb_askpass                                           306     321     +15
pw_encrypt                                            38      39      +1
static.passwd                                         64       4     -60
static.cipher                                        128       4    -124
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/2 up/down: 16/-184)          Total: -168 bytes

# size busybox_old busybox_unstripped
   text    data     bss     dec     hex filename
 683705    2704   14240  700649   ab0e9 busybox_old
 683721    2704   14064  700489   ab049 busybox_unstripped

libbb/bb_askpass.c
libbb/pw_encrypt.c

index 0f1f68687cc29b862dd0e170da0f414bc117d016..5ad234921f822f482330e37cdf63d73d999495b2 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <termios.h>
-//#include <sys/ioctl.h>
 
 #include "libbb.h"
 
@@ -20,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);
 
@@ -48,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
@@ -64,7 +69,7 @@ char *bb_askpass(int timeout, const char * prompt)
        }
 
        tcsetattr(STDIN_FILENO, TCSANOW, &old);
-       puts("");
+       putchar('\n');
        fflush(stdout);
        return ret;
 }
index d546bc883ec4d3606b37f19b1fbd7b031720e981..e9cf4e3b8ec5f8d0c49145e7d5e5a8f011b031e6 100644 (file)
 
 char *pw_encrypt(const char *clear, const char *salt)
 {
-       static char cipher[128];
-       char *cp;
+       /* Was static char[BIGNUM]. Malloced thing works as well */
+       static char *cipher;
 
 #if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */
        if (strncmp(salt, "$2$", 3) == 0) {
                return sha1_crypt(clear);
        }
 #endif
-       cp = (char *) crypt(clear, salt);
-       /* if crypt (a nonstandard crypt) returns a string too large,
-          truncate it so we don't overrun buffers and hope there is
-          enough security in what's left */
-       safe_strncpy(cipher, cp, sizeof(cipher));
+
+       free(cipher);
+       cipher = xstrdup(crypt(clear, salt));
        return cipher;
 }