use auto_string() where appropriate to kill a few statics
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Oct 2015 16:16:40 +0000 (18:16 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Oct 2015 16:16:40 +0000 (18:16 +0200)
Custom linker script 'busybox_ldscript' found, using it
function                                             old     new   delta
static.str                                             4       -      -4
static.passwd                                          4       0      -4
bb_ask                                               322     311     -11
ether_print                                           63      47     -16
UNSPEC_print                                          82      66     -16
INET_sprint                                           59      38     -21
INET6_sprint                                          54      30     -24
make_human_readable_str                              292     235     -57
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/7 up/down: 0/-153)           Total: -153 bytes
   text    data     bss     dec     hex filename
 939880     992   17480  958352   e9f90 busybox_old
 939736     992   17456  958184   e9ee8 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/bb_askpass.c
libbb/human_readable.c
miscutils/devfsd.c
networking/interface.c

index 1927ba9e95102b8523822114f89c393d023ebb4d..c2580b9ebe6914e3fe778914f20f32fad3f04ca7 100644 (file)
@@ -1,7 +1,6 @@
 /* vi: set sw=4 ts=4: */
 /*
  * Ask for a password
- * I use a static buffer in this function.  Plan accordingly.
  *
  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
  *
@@ -23,8 +22,8 @@ char* FAST_FUNC bb_ask(const int fd, int timeout, const char *prompt)
 {
        /* Was static char[BIGNUM] */
        enum { sizeof_passwd = 128 };
-       static char *passwd;
 
+       char *passwd;
        char *ret;
        int i;
        struct sigaction sa, oldsa;
@@ -62,8 +61,7 @@ char* FAST_FUNC bb_ask(const int fd, int timeout, const char *prompt)
                alarm(timeout);
        }
 
-       if (!passwd)
-               passwd = xmalloc(sizeof_passwd);
+       passwd = auto_string(xmalloc(sizeof_passwd));
        ret = passwd;
        i = 0;
        while (1) {
index 0b2eb777e2375c7f939ddcbba5eab7f589fc76a1..5c7fc076ff52a9e9f0b46d869446ec4f2bc5b727 100644 (file)
@@ -37,8 +37,6 @@ const char* FAST_FUNC make_human_readable_str(unsigned long long val,
                '\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'
        };
 
-       static char *str;
-
        unsigned frac; /* 0..9 - the fractional digit */
        const char *u;
        const char *fmt;
@@ -81,12 +79,7 @@ const char* FAST_FUNC make_human_readable_str(unsigned long long val,
 #endif
        }
 
-       if (!str) {
-               /* sufficient for any width of val */
-               str = xmalloc(sizeof(val)*3 + 2 + 3);
-       }
-       sprintf(str, fmt, val, frac, *u);
-       return str;
+       return auto_string(xasprintf(fmt, val, frac, *u));
 }
 
 
index 5a6aec6bd6865260d2a65c721d80ef671cfa3bc6..9256567cccc28c6034236e758bb16899c96fcdfe 100644 (file)
@@ -1142,19 +1142,19 @@ static void signal_handler(int sig)
 
 static const char *get_variable(const char *variable, void *info)
 {
-       static char sbuf[sizeof(int)*3 + 2]; /* sign and NUL */
        static char *hostname;
 
        struct get_variable_info *gv_info = info;
        const char *field_names[] = {
-                       "hostname", "mntpt", "devpath", "devname",
-                       "uid", "gid", "mode", hostname, mount_point,
-                       gv_info->devpath, gv_info->devname, NULL
+                       "hostname", "mntpt", "devpath", "devname", "uid", "gid", "mode",
+                       NULL, mount_point, gv_info->devpath, gv_info->devname, NULL
        };
        int i;
 
        if (!hostname)
                hostname = safe_gethostname();
+       field_names[7] = hostname;
+
        /* index_in_str_array returns i>=0  */
        i = index_in_str_array(field_names, variable);
 
@@ -1164,12 +1164,11 @@ static const char *get_variable(const char *variable, void *info)
                return field_names[i + 7];
 
        if (i == 4)
-               sprintf(sbuf, "%u", gv_info->info->uid);
-       else if (i == 5)
-               sprintf(sbuf, "%u", gv_info->info->gid);
-       else if (i == 6)
-               sprintf(sbuf, "%o", gv_info->info->mode);
-       return sbuf;
+               return auto_string(xasprintf("%u", gv_info->info->uid));
+       if (i == 5)
+               return auto_string(xasprintf("%u", gv_info->info->gid));
+       /* i == 6 */
+       return auto_string(xasprintf("%o", gv_info->info->mode));
 }   /*  End Function get_variable  */
 
 static void service(struct stat statbuf, char *path)
index b0572d04e578a312b2021206a0c7fa83f258cbfe..24bd13c576866a57a120f1bc1ee1ea8f6053da5d 100644 (file)
@@ -89,13 +89,9 @@ struct in6_ifreq {
 /* Display an Internet socket address. */
 static const char* FAST_FUNC INET_sprint(struct sockaddr *sap, int numeric)
 {
-       static char *buff; /* defaults to NULL */
-
        if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
                return "[NONE SET]";
-       free(buff);
-       buff = INET_rresolve((struct sockaddr_in *) sap, numeric, 0xffffff00);
-       return buff;
+       return auto_string(INET_rresolve((struct sockaddr_in *) sap, numeric, 0xffffff00));
 }
 
 #ifdef UNUSED_AND_BUGGY
@@ -171,13 +167,9 @@ static const struct aftype inet_aftype = {
 /* dirty! struct sockaddr usually doesn't suffer for inet6 addresses, fst. */
 static const char* FAST_FUNC INET6_sprint(struct sockaddr *sap, int numeric)
 {
-       static char *buff;
-
        if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
                return "[NONE SET]";
-       free(buff);
-       buff = INET6_rresolve((struct sockaddr_in6 *) sap, numeric);
-       return buff;
+       return auto_string(INET6_rresolve((struct sockaddr_in6 *) sap, numeric));
 }
 
 #ifdef UNUSED
@@ -223,13 +215,11 @@ static const struct aftype inet6_aftype = {
 /* Display an UNSPEC address. */
 static char* FAST_FUNC UNSPEC_print(unsigned char *ptr)
 {
-       static char *buff;
-
+       char *buff;
        char *pos;
        unsigned int i;
 
-       if (!buff)
-               buff = xmalloc(sizeof(struct sockaddr) * 3 + 1);
+       buff = auto_string(xmalloc(sizeof(struct sockaddr) * 3 + 1));
        pos = buff;
        for (i = 0; i < sizeof(struct sockaddr); i++) {
                /* careful -- not every libc's sprintf returns # bytes written */
@@ -712,14 +702,12 @@ static const struct hwtype loop_hwtype = {
 /* Display an Ethernet address in readable format. */
 static char* FAST_FUNC ether_print(unsigned char *ptr)
 {
-       static char *buff;
-
-       free(buff);
+       char *buff;
        buff = xasprintf("%02X:%02X:%02X:%02X:%02X:%02X",
                         (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
                         (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
                );
-       return buff;
+       return auto_string(buff);
 }
 
 static const struct hwtype ether_hwtype = {