mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-23 03:10:05 +00:00
(getaddrinfo): If determinination of source address fails, initialized source_addr_len field so that duplicate address recognition does not copy junk.
This commit is contained in:
parent
9fd3ceaebd
commit
007a3ddc23
@ -1561,10 +1561,7 @@ getaddrinfo (const char *name, const char *service,
|
|||||||
results[i].dest_addr = q;
|
results[i].dest_addr = q;
|
||||||
results[i].got_source_addr = false;
|
results[i].got_source_addr = false;
|
||||||
|
|
||||||
/* We overwrite the type with SOCK_DGRAM since we do not
|
/* If we just looked up the address for a different
|
||||||
want connect() to connect to the other side. If we
|
|
||||||
cannot determine the source address remember this
|
|
||||||
fact. If we just looked up the address for a different
|
|
||||||
protocol, reuse the result. */
|
protocol, reuse the result. */
|
||||||
if (last != NULL && last->ai_addrlen == q->ai_addrlen
|
if (last != NULL && last->ai_addrlen == q->ai_addrlen
|
||||||
&& memcmp (last->ai_addr, q->ai_addr, q->ai_addrlen) == 0)
|
&& memcmp (last->ai_addr, q->ai_addr, q->ai_addrlen) == 0)
|
||||||
@ -1576,21 +1573,28 @@ getaddrinfo (const char *name, const char *service,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* We overwrite the type with SOCK_DGRAM since we do not
|
||||||
|
want connect() to connect to the other side. If we
|
||||||
|
cannot determine the source address remember this
|
||||||
|
fact. */
|
||||||
int fd = __socket (q->ai_family, SOCK_DGRAM, IPPROTO_IP);
|
int fd = __socket (q->ai_family, SOCK_DGRAM, IPPROTO_IP);
|
||||||
if (fd != -1)
|
socklen_t sl = sizeof (results[i].source_addr);
|
||||||
|
if (fd != -1
|
||||||
|
&& __connect (fd, q->ai_addr, q->ai_addrlen) == 0
|
||||||
|
&& __getsockname (fd,
|
||||||
|
(struct sockaddr *) &results[i].source_addr,
|
||||||
|
&sl) == 0)
|
||||||
{
|
{
|
||||||
socklen_t sl = sizeof (results[i].source_addr);
|
results[i].source_addr_len = sl;
|
||||||
if (__connect (fd, q->ai_addr, q->ai_addrlen) == 0
|
results[i].got_source_addr = true;
|
||||||
&& __getsockname (fd,
|
|
||||||
(struct sockaddr *) &results[i].source_addr,
|
|
||||||
&sl) == 0)
|
|
||||||
{
|
|
||||||
results[i].source_addr_len = sl;
|
|
||||||
results[i].got_source_addr = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
close_not_cancel_no_status (fd);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
/* Just make sure that if we have to process the same
|
||||||
|
address again we do not copy any memory. */
|
||||||
|
results[i].source_addr_len = 0;
|
||||||
|
|
||||||
|
if (fd != -1)
|
||||||
|
close_not_cancel_no_status (fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remember the canonical name. */
|
/* Remember the canonical name. */
|
||||||
|
Loading…
Reference in New Issue
Block a user