2004-08-17  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/posix/getaddrinfo.c: Fix memory handling of
	ai_canonname.
This commit is contained in:
Ulrich Drepper 2004-08-18 05:10:14 +00:00
parent 9b63bd4d9e
commit b934376424
2 changed files with 25 additions and 24 deletions

View File

@ -1,3 +1,8 @@
2004-08-17 Ulrich Drepper <drepper@redhat.com>
* sysdeps/posix/getaddrinfo.c: Fix memory handling of
ai_canonname.
2004-08-16 Ulrich Drepper <drepper@redhat.com> 2004-08-16 Ulrich Drepper <drepper@redhat.com>
* resolv/nss_dns/dns-canon.c (_nss_dns_getcanonname_r): Don't use * resolv/nss_dns/dns-canon.c (_nss_dns_getcanonname_r): Don't use

View File

@ -738,7 +738,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
struct gaih_servtuple *st2; struct gaih_servtuple *st2;
struct gaih_addrtuple *at2 = at; struct gaih_addrtuple *at2 = at;
size_t socklen; size_t socklen;
size_t canonlen;
sa_family_t family; sa_family_t family;
/* /*
@ -806,19 +805,22 @@ gaih_inet (const char *name, const struct gaih_service *service,
return -EAI_IDN_ENCODE; return -EAI_IDN_ENCODE;
} }
/* In case the output string is the same as the input /* In case the output string is the same as the input
string no new string has been allocated. */ string no new string has been allocated. Otherwise
if (out != canon) make a copy. */
{ if (out == canon)
canon = strdupa (out); goto make_copy;
free (out);
}
} }
else
#endif #endif
{
canonlen = strlen (canon) + 1; #ifdef HAVE_LIBIDN
make_copy:
#endif
canon = strdup (canon);
if (canon == NULL)
return -EAI_MEMORY;
}
} }
else
canonlen = 0;
if (at2->family == AF_INET6) if (at2->family == AF_INET6)
{ {
@ -841,7 +843,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
for (st2 = st; st2 != NULL; st2 = st2->next) for (st2 = st; st2 != NULL; st2 = st2->next)
{ {
*pai = malloc (sizeof (struct addrinfo) + socklen + canonlen); *pai = malloc (sizeof (struct addrinfo) + socklen);
if (*pai == NULL) if (*pai == NULL)
return -EAI_MEMORY; return -EAI_MEMORY;
@ -851,6 +853,11 @@ gaih_inet (const char *name, const struct gaih_service *service,
(*pai)->ai_protocol = st2->protocol; (*pai)->ai_protocol = st2->protocol;
(*pai)->ai_addrlen = socklen; (*pai)->ai_addrlen = socklen;
(*pai)->ai_addr = (void *) (*pai + 1); (*pai)->ai_addr = (void *) (*pai + 1);
/* We only add the canonical name once. */
(*pai)->ai_canonname = canon;
canon = NULL;
#if SALEN #if SALEN
(*pai)->ai_addr->sa_len = socklen; (*pai)->ai_addr->sa_len = socklen;
#endif /* SALEN */ #endif /* SALEN */
@ -877,18 +884,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
memset (sinp->sin_zero, '\0', sizeof (sinp->sin_zero)); memset (sinp->sin_zero, '\0', sizeof (sinp->sin_zero));
} }
if (canonlen != 0)
{
(*pai)->ai_canonname = ((void *) (*pai) +
sizeof (struct addrinfo) + socklen);
strcpy ((*pai)->ai_canonname, canon);
/* We do not need to allocate the canonical name anymore. */
canonlen = 0;
}
else
(*pai)->ai_canonname = NULL;
(*pai)->ai_next = NULL; (*pai)->ai_next = NULL;
pai = &((*pai)->ai_next); pai = &((*pai)->ai_next);
} }
@ -1445,6 +1440,7 @@ freeaddrinfo (struct addrinfo *ai)
{ {
p = ai; p = ai;
ai = ai->ai_next; ai = ai->ai_next;
free (p->ai_canonname);
free (p); free (p);
} }
} }