forked from rpms/glibc
fb633eaa14
remaining patches into distinct patchfiles. Thanks to Dmitry V. Levin for identifying them! Drop ia64 specific patches and specfile fragments
129 lines
3.7 KiB
Diff
129 lines
3.7 KiB
Diff
From bf18f175afdb59cdcd1016995b351e2bbb1d6ba7 Mon Sep 17 00:00:00 2001
|
|
From: Andreas Schwab <schwab@redhat.com>
|
|
Date: Tue, 21 Jun 2011 17:28:57 +0200
|
|
Subject: [PATCH] Don't use gethostbyaddr to determine canonical name
|
|
|
|
* sysdeps/posix/getaddrinfo.c (gaih_inet): Don't use gethostbyaddr
|
|
to determine canonical name.
|
|
|
|
---
|
|
ChangeLog | 5 +++
|
|
sysdeps/posix/getaddrinfo.c | 77 +++----------------------------------------
|
|
2 files changed, 10 insertions(+), 72 deletions(-)
|
|
|
|
--- a/sysdeps/posix/getaddrinfo.c
|
|
+++ b/sysdeps/posix/getaddrinfo.c
|
|
@@ -565,8 +565,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
|
|
/* If we do not have to look for IPv6 addresses, use
|
|
the simple, old functions, which do not support
|
|
- IPv6 scope ids. */
|
|
- if (req->ai_family == AF_INET)
|
|
+ IPv6 scope ids, nor retrieving the canonical name. */
|
|
+ if (req->ai_family == AF_INET && (req->ai_flags & AI_CANONNAME) == 0)
|
|
{
|
|
/* Allocate additional room for struct host_data. */
|
|
size_t tmpbuflen = (512 + MAX_NR_ALIASES * sizeof(char*)
|
|
@@ -1107,70 +1107,10 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
/* Only the first entry gets the canonical name. */
|
|
if (at2 == at && (req->ai_flags & AI_CANONNAME) != 0)
|
|
{
|
|
- char *tmpbuf2 = NULL;
|
|
- bool malloc_tmpbuf2 = false;
|
|
-
|
|
if (canon == NULL)
|
|
- {
|
|
- struct hostent *h = NULL;
|
|
- int herrno;
|
|
- struct hostent th;
|
|
- /* Add room for struct host_data. */
|
|
- size_t tmpbuf2len = (512 + (MAX_NR_ALIASES+MAX_NR_ADDRS+1)
|
|
- * sizeof(char*) + 16 * sizeof(char));
|
|
-
|
|
- do
|
|
- {
|
|
- if (__libc_use_alloca (alloca_used + 2 * tmpbuf2len))
|
|
- tmpbuf2 = extend_alloca_account (tmpbuf2, tmpbuf2len,
|
|
- tmpbuf2len * 2,
|
|
- alloca_used);
|
|
- else
|
|
- {
|
|
- char *newp = realloc (malloc_tmpbuf2 ? tmpbuf2 : NULL,
|
|
- 2 * tmpbuf2len);
|
|
- if (newp == NULL)
|
|
- {
|
|
- if (malloc_tmpbuf2)
|
|
- free (tmpbuf2);
|
|
- result = -EAI_MEMORY;
|
|
- goto free_and_return;
|
|
- }
|
|
-
|
|
- tmpbuf2 = newp;
|
|
- tmpbuf2len = 2 * tmpbuf2len;
|
|
- malloc_tmpbuf2 = true;
|
|
- }
|
|
-
|
|
- rc = __gethostbyaddr_r (at2->addr,
|
|
- ((at2->family == AF_INET6)
|
|
- ? sizeof (struct in6_addr)
|
|
- : sizeof (struct in_addr)),
|
|
- at2->family, &th, tmpbuf2,
|
|
- tmpbuf2len, &h, &herrno);
|
|
- }
|
|
- while (rc == ERANGE && herrno == NETDB_INTERNAL);
|
|
-
|
|
- if (rc != 0 && herrno == NETDB_INTERNAL)
|
|
- {
|
|
- if (malloc_tmpbuf2)
|
|
- free (tmpbuf2);
|
|
-
|
|
- __set_h_errno (herrno);
|
|
- result = -EAI_SYSTEM;
|
|
- goto free_and_return;
|
|
- }
|
|
-
|
|
- if (h != NULL)
|
|
- canon = h->h_name;
|
|
- else
|
|
- {
|
|
- assert (orig_name != NULL);
|
|
- /* If the canonical name cannot be determined, use
|
|
- the passed in string. */
|
|
- canon = orig_name;
|
|
- }
|
|
- }
|
|
+ /* If the canonical name cannot be determined, use
|
|
+ the passed in string. */
|
|
+ canon = orig_name;
|
|
|
|
#ifdef HAVE_LIBIDN
|
|
if (req->ai_flags & AI_CANONIDN)
|
|
@@ -1185,9 +1125,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
int rc = __idna_to_unicode_lzlz (canon, &out, idn_flags);
|
|
if (rc != IDNA_SUCCESS)
|
|
{
|
|
- if (malloc_tmpbuf2)
|
|
- free (tmpbuf2);
|
|
-
|
|
if (rc == IDNA_MALLOC_ERROR)
|
|
result = -EAI_MEMORY;
|
|
else if (rc == IDNA_DLOPEN_ERROR)
|
|
@@ -1217,17 +1154,11 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|
canon = strdup (canon);
|
|
if (canon == NULL)
|
|
{
|
|
- if (malloc_tmpbuf2)
|
|
- free (tmpbuf2);
|
|
-
|
|
result = -EAI_MEMORY;
|
|
goto free_and_return;
|
|
}
|
|
}
|
|
}
|
|
-
|
|
- if (malloc_tmpbuf2)
|
|
- free (tmpbuf2);
|
|
}
|
|
|
|
family = at2->family;
|