OSDN Git Service

Reduce memory used by static buffers and allocate that memory dynamicly
authorEric Andersen <andersen@codepoet.org>
Thu, 18 Mar 2004 11:12:34 +0000 (11:12 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 18 Mar 2004 11:12:34 +0000 (11:12 -0000)
instead.  Based on an initial patch from Tobias Anderberg, but reworked.  I
asked Tobias to look into doing something more like what is done in busybox,
but that proved to be a pain.

One possible concern is that these buffers will probably show up as
memory leaks i.e. with valgrind.  Perhaps we should add in an atexit
call to free this memory right after we allocate it?

libc/inet/getnetent.c
libc/inet/getproto.c
libc/inet/getservice.c
libc/misc/mntent/mntent.c
libc/misc/ttyent/getttyent.c

index 9ade1f6..8c22c0a 100644 (file)
@@ -37,7 +37,7 @@ static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
 #define        MAXALIASES      35
 static const char NETDB[] = _PATH_NETWORKS;
 static FILE *netf = NULL;
-static char line[BUFSIZ+1];
+static char *line = NULL;
 static struct netent net;
 static char *net_aliases[MAXALIASES];
 
@@ -90,6 +90,13 @@ struct netent * getnetent(void)
        return (NULL);
     }
 again:
+
+    if (!line) {
+       line = malloc(BUFSIZ + 1);
+       if (!line)
+           abort();
+    }
+
     p = fgets(line, BUFSIZ, netf);
     if (p == NULL) {
        UNLOCK;
@@ -114,7 +121,7 @@ again:
     net.n_net = inet_network(cp);
     net.n_addrtype = AF_INET;
     q = net.n_aliases = net_aliases;
-    if (p != NULL) 
+    if (p != NULL)
        cp = p;
     while (cp && *cp) {
        if (*cp == ' ' || *cp == '\t') {
index 1d3a5ef..c9f35f1 100644 (file)
@@ -75,12 +75,22 @@ static pthread_mutex_t mylock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 
 
 #define        MAXALIASES      35
+#define        SBUFSIZE        (BUFSIZ + 1 + (sizeof(char *) * MAXALIASES))
 
 static FILE *protof = NULL;
 static struct protoent proto;
-static char static_aliases[BUFSIZ+1 + sizeof(char *)*MAXALIASES];
+static char *static_aliases = NULL;
 static int proto_stayopen;
 
+static void __initbuf(void)
+{
+    if (!static_aliases) {
+       static_aliases = malloc(SBUFSIZE);
+       if (!static_aliases)
+           abort();
+    }
+}
+
 void setprotoent(int f)
 {
     LOCK;
@@ -183,7 +193,9 @@ again:
 struct protoent * getprotoent(void)
 {
     struct protoent *result;
-    getprotoent_r(&proto, static_aliases, sizeof(static_aliases), &result);
+
+    __initbuf();
+    getprotoent_r(&proto, static_aliases, SBUFSIZE, &result);
     return result;
 }
 
@@ -216,7 +228,9 @@ found:
 struct protoent * getprotobyname(const char *name)
 {
     struct protoent *result;
-    getprotobyname_r(name, &proto, static_aliases, sizeof(static_aliases), &result);
+
+    __initbuf();
+    getprotobyname_r(name, &proto, static_aliases, SBUFSIZE, &result);
     return result;
 }
 
@@ -242,7 +256,10 @@ int getprotobynumber_r (int proto_num,
 struct protoent * getprotobynumber(int proto_num)
 {
     struct protoent *result;
-    getprotobynumber_r(proto_num, &proto, static_aliases, sizeof(static_aliases), &result);
+
+    __initbuf();
+    getprotobynumber_r(proto_num, &proto, static_aliases,
+                       SBUFSIZE, &result);
     return result;
 }
 
index fb22ff9..606def8 100644 (file)
@@ -81,12 +81,22 @@ static pthread_mutex_t mylock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 
 
 #define        MAXALIASES      35
+#define SBUFSIZE       (BUFSIZ + 1 + (sizeof(char *) * MAXALIASES))
 
 static FILE *servf = NULL;
 static struct servent serv;
-static char buf[BUFSIZ+1 + sizeof(char *)*MAXALIASES];
+static char *buf = NULL;
 static int serv_stayopen;
 
+static void __initbuf(void)
+{
+    if (!buf) {
+       buf = malloc(SBUFSIZE);
+       if (!buf)
+           abort();
+    }
+}
+
 void setservent(int f)
 {
     LOCK;
@@ -112,7 +122,9 @@ void endservent(void)
 struct servent * getservent(void)
 {
     struct servent *result;
-    getservent_r(&serv, buf, sizeof(buf), &result);
+
+    __initbuf();
+    getservent_r(&serv, buf, SBUFSIZE, &result);
     return result;
 }
 
@@ -120,7 +132,9 @@ struct servent * getservent(void)
 struct servent *getservbyname(const char *name, const char *proto)
 {
     struct servent *result;
-    getservbyname_r(name, proto, &serv, buf, sizeof(buf), &result);
+
+    __initbuf();
+    getservbyname_r(name, proto, &serv, buf, SBUFSIZE, &result);
     return result;
 }
 
@@ -128,7 +142,9 @@ struct servent *getservbyname(const char *name, const char *proto)
 struct servent * getservbyport(int port, const char *proto)
 {
     struct servent *result;
-    getservbyport_r(port, proto, &serv, buf, sizeof(buf), &result);
+
+    __initbuf();
+    getservbyport_r(port, proto, &serv, buf, SBUFSIZE, &result);
     return result;
 }
 
index 93d5918..d98a687 100644 (file)
@@ -65,10 +65,17 @@ struct mntent *getmntent_r (FILE *filep,
 struct mntent *getmntent(FILE * filep)
 {
     struct mntent *tmp;
-    static char buff[BUFSIZ];
+    static char *buff = NULL;
     static struct mntent mnt;
     LOCK;
-    tmp = getmntent_r(filep, &mnt, buff, sizeof buff);
+    
+    if (!buff) {
+            buff = malloc(BUFSIZ);
+               if (!buff)
+                   abort();
+    }
+    
+    tmp = getmntent_r(filep, &mnt, buff, BUFSIZ);
     UNLOCK;
     return(tmp);
 }
index 18b9109..0b2c9a3 100644 (file)
@@ -99,11 +99,19 @@ struct ttyent * getttyent(void)
 {
     register int c;
     register char *p;
-    static char line[BUFSIZ];
+    static char *line = NULL;
 
     if (!tf && !setttyent())
        return (NULL);
+
+    if (!line) {
+            line = malloc(BUFSIZ);
+               if (!line)
+                   abort();
+    }
+
     flockfile (tf);
+
     for (;;) {
        if (!fgets_unlocked(p = line, sizeof(line), tf)) {
            funlockfile (tf);