diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-05-02 21:03:32 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-05-02 21:03:32 +0000 |
commit | 238ae1eb669cd42b99471653c32d18a1c90cc787 (patch) | |
tree | 2be68b9df5ed8f9616eaed6aef190b33fb58ba8f /sysdeps/posix/getaddrinfo.c | |
parent | 48afc878d8da73bd180c47a77167bb55712d91cc (diff) | |
download | glibc-238ae1eb669cd42b99471653c32d18a1c90cc787.tar glibc-238ae1eb669cd42b99471653c32d18a1c90cc787.tar.gz glibc-238ae1eb669cd42b99471653c32d18a1c90cc787.tar.bz2 glibc-238ae1eb669cd42b99471653c32d18a1c90cc787.zip |
Update.
* sysdeps/posix/getaddrinfo.c (gaih_inet_serv): Change fourth
parameter to struct gaih_servtuple *. Adapt appropriately.
(gaih_inet): Use alloca to allocate room for gaih_inet_serv calls.
This fixes a memory leak.
Reported by Mikolaj J. Habryn <dichro-glibcbug@rcpt.to>.
Diffstat (limited to 'sysdeps/posix/getaddrinfo.c')
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index bee95acabc..f43aa03d1f 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -190,7 +190,7 @@ gaih_local (const char *name, const struct gaih_service *service, static int gaih_inet_serv (const char *servicename, struct gaih_typeproto *tp, - struct gaih_servtuple **st) + struct gaih_servtuple *st) { struct servent *s; size_t tmpbuflen = 1024; @@ -216,14 +216,10 @@ gaih_inet_serv (const char *servicename, struct gaih_typeproto *tp, } while (r); - *st = malloc (sizeof (struct gaih_servtuple)); - if (*st == NULL) - return -EAI_MEMORY; - - (*st)->next = NULL; - (*st)->socktype = tp->socktype; - (*st)->protocol = tp->protocol; - (*st)->port = s->s_port; + st->next = NULL; + st->socktype = tp->socktype; + st->protocol = tp->protocol; + st->port = s->s_port; return 0; } @@ -297,7 +293,10 @@ gaih_inet (const char *name, const struct gaih_service *service, { if (tp->name != NULL) { - if ((rc = gaih_inet_serv (service->name, tp, &st))) + st = (struct gaih_servtuple *) + __alloca (sizeof (struct gaih_servtuple)); + + if ((rc = gaih_inet_serv (service->name, tp, st))) return rc; } else @@ -305,13 +304,18 @@ gaih_inet (const char *name, const struct gaih_service *service, struct gaih_servtuple **pst = &st; for (tp++; tp->name; tp++) { - if ((rc = gaih_inet_serv (service->name, tp, pst))) + struct gaih_servtuple *newp = (struct gaih_servtuple *) + __alloca (sizeof (struct gaih_servtuple)); + + if ((rc = gaih_inet_serv (service->name, tp, newp))) { if (rc & GAIH_OKIFUNSPEC) continue; return rc; } - pst = &((*pst)->next); + + *pst = newp; + pst = &(newp->next); } if (st == &nullserv) return (GAIH_OKIFUNSPEC | -EAI_SERVICE); |