mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08:00
Don't use gethostbyaddr to determine canonical name
This commit is contained in:
parent
c5d5d574cb
commit
b957ced889
@ -1,3 +1,9 @@
|
||||
2013-10-17 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
[BZ #15218]
|
||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): Don't use gethostbyaddr
|
||||
to determine canonical name.
|
||||
|
||||
2013-10-17 Ondřej Bílka <neleai@seznam.cz>
|
||||
|
||||
* sysdeps/ieee754/dbl-64/dbl2mpn.c: Fix formatting.
|
||||
|
14
NEWS
14
NEWS
@ -10,13 +10,13 @@ Version 2.19
|
||||
* The following bugs are resolved with this release:
|
||||
|
||||
156, 431, 832, 13028, 13982, 13985, 14155, 14547, 14699, 14910, 15048,
|
||||
15308, 15362, 15400, 15427, 15522, 15531, 15532, 15608, 15609, 15610,
|
||||
15632, 15640, 15672, 15680, 15681, 15723, 15734, 15735, 15736, 15748,
|
||||
15749, 15754, 15760, 15764, 15797, 15844, 15847, 15849, 15855, 15856,
|
||||
15857, 15859, 15867, 15886, 15887, 15890, 15892, 15893, 15895, 15897,
|
||||
15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966, 15988, 16032,
|
||||
15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966, 15988, 16032,
|
||||
16034, 16036, 16041.
|
||||
15218, 15308, 15362, 15400, 15427, 15522, 15531, 15532, 15608, 15609,
|
||||
15610, 15632, 15640, 15672, 15680, 15681, 15723, 15734, 15735, 15736,
|
||||
15748, 15749, 15754, 15760, 15764, 15797, 15844, 15847, 15849, 15855,
|
||||
15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892, 15893, 15895,
|
||||
15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966, 15988,
|
||||
16032, 15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966, 15988,
|
||||
16032, 16034, 16036, 16041.
|
||||
|
||||
* CVE-2012-4412 The strcoll implementation caches indices and rules for
|
||||
large collation sequences to optimize multiple passes. This cache
|
||||
|
@ -564,10 +564,11 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
int no_more;
|
||||
int old_res_options;
|
||||
|
||||
/* 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)
|
||||
/* If we do not have to look for IPv6 addresses or the canonical
|
||||
name, use the simple, old functions, which do not support
|
||||
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*)
|
||||
@ -1009,8 +1010,9 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
canon = s;
|
||||
else
|
||||
{
|
||||
/* Set to name now to avoid using
|
||||
gethostbyaddr. */
|
||||
/* If the canonical name cannot be
|
||||
determined, use the passed in
|
||||
string. */
|
||||
if (malloc_canonbuf)
|
||||
{
|
||||
free (canonbuf);
|
||||
@ -1125,70 +1127,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)
|
||||
@ -1203,9 +1145,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)
|
||||
@ -1235,17 +1174,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;
|
||||
|
Loading…
Reference in New Issue
Block a user