OSDN Git Service

getnet: simplify alias handling and reduce MAXALIASES
authorNatanael Copa <natanael.copa@gmail.com>
Thu, 14 Oct 2010 06:35:09 +0000 (06:35 +0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 14 Oct 2010 13:00:03 +0000 (15:00 +0200)
Reduce MAXALIASES to something lower. There will probably never be
need for more than 1 alias but we allow a few extra.

While here we alos fix segfault when there are too many aliases.

Signed-off-by: Natanael Copa <natanael.copa@gmail.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
libc/inet/getnet.c

index c604b63..9049f97 100644 (file)
@@ -27,9 +27,11 @@ aliases: case sensitive optional space or tab separated list of other names
 #include <bits/uClibc_mutex.h>
 __UCLIBC_MUTEX_STATIC(mylock, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP);
 
-#define        MAXALIASES      35
-#define BUFSZ          (80) /* one line */
-#define SBUFSIZE       (BUFSZ + 1 + (sizeof(char *) * MAXALIASES))
+#define MINTOKENS      2
+#define        MAXALIASES      8
+#define MAXTOKENS      (MINTOKENS + MAXALIASES + 1)
+#define BUFSZ          (255) /* one line */
+#define SBUFSIZE       (BUFSZ + 1 + (sizeof(char *) * MAXTOKENS))
 
 static parser_t *netp = NULL;
 static struct netent nete;
@@ -65,10 +67,8 @@ int getnetent_r(struct netent *result_buf,
                                int *h_errnop
                                 )
 {
-       char **alias, *cp = NULL;
-       char **net_aliases;
        char **tok = NULL;
-       const size_t aliaslen = sizeof(*net_aliases) * MAXALIASES;
+       const size_t aliaslen = sizeof(char *) * MAXTOKENS;
        int ret = ERANGE;
 
        *result = NULL;
@@ -86,7 +86,7 @@ int getnetent_r(struct netent *result_buf,
        netp->data_len = aliaslen;
        netp->line_len = buflen - aliaslen;
        /* <name>[[:space:]]<netnumber>[[:space:]][<aliases>] */
-       if (!config_read(netp, &tok, 3, 2, "# \t/", PARSE_NORMAL)) {
+       if (!config_read(netp, &tok, MAXTOKENS-1, MINTOKENS, "# \t/", PARSE_NORMAL)) {
                goto DONE;
        }
        result_buf->n_name = *(tok++);
@@ -110,16 +110,7 @@ int getnetent_r(struct netent *result_buf,
                        sa4_to_uint32(addri->ai_addr);
                freeaddrinfo(addri);
        }
-       result_buf->n_aliases = alias = net_aliases = tok;
-       cp = *alias;
-       while (cp && *cp) {
-               if (alias < &net_aliases[MAXALIASES - 1])
-                       *alias++ = cp;
-               cp = strpbrk(cp, " \t");
-               if (cp != NULL)
-                       *cp++ = '\0';
-       }
-       *alias = NULL;
+       result_buf->n_aliases = tok;
        *result = result_buf;
        ret = 0;
  DONE: