OSDN Git Service

getservice: getservent_r must return ERANGE when buffer is too small
authorNatanael Copa <natanael.copa@gmail.com>
Thu, 14 Oct 2010 06:35:05 +0000 (06:35 +0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Thu, 14 Oct 2010 12:59:57 +0000 (14:59 +0200)
This fixes issue introduced by 72e1a1ce186c39f07282398e2af9eb0253e60f15

This should also fix the following testcase to exit with error rather
than cause an endless loop.

int main(void) {
if (getservbyname("non-existing", "udp") == NULL)
err(1, "getservbyname");
return 0;
}

Reported by Pirmin Walthert
http://lists.uclibc.org/pipermail/uclibc/2010-August/044277.html

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

index 47d26a2..c38ff80 100644 (file)
@@ -69,7 +69,7 @@ int getservent_r(struct servent *result_buf,
        char **serv_aliases;
        char **tok = NULL;
        const size_t aliaslen = sizeof(*serv_aliases) * MAXALIASES;
-       int ret = ENOENT;
+       int ret = ERANGE;
 
        *result = NULL;
        if (buflen < aliaslen
@@ -77,7 +77,7 @@ int getservent_r(struct servent *result_buf,
                goto DONE_NOUNLOCK;
 
        __UCLIBC_MUTEX_LOCK(mylock);
-
+       ret = ENOENT;
        if (servp == NULL)
                setservent(serv_stayopen);
        if (servp == NULL)
@@ -88,7 +88,6 @@ int getservent_r(struct servent *result_buf,
        servp->line_len = buflen - aliaslen;
        /* <name>[[:space:]]<port>/<proto>[[:space:]][<aliases>] */
        if (!config_read(servp, &tok, MAXALIASES, 3, "# \t/", PARSE_NORMAL)) {
-               ret = ERANGE;
                goto DONE;
        }
        result_buf->s_name = *(tok++);