mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
Always use IPv4 sockets for IPv4 addresses.
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
2010-01-14 Ulrich Drepper <drepper@redhat.com>
|
2010-01-14 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
[BZ #11141]
|
||||||
|
* resolv/res_send.c (reopen): Don't use IPv6 sockets for IPv4
|
||||||
|
addresses.
|
||||||
|
|
||||||
[BZ #11127]
|
[BZ #11127]
|
||||||
* posix/regcomp.c (alc_eclosure_iter): Do not ignore
|
* posix/regcomp.c (alc_eclosure_iter): Do not ignore
|
||||||
re_node_set_insert failure; return REG_ESPACE.
|
re_node_set_insert failure; return REG_ESPACE.
|
||||||
|
@@ -199,10 +199,6 @@ static void Perror(const res_state, FILE *, const char *, int);
|
|||||||
#endif
|
#endif
|
||||||
static int sock_eq(struct sockaddr_in6 *, struct sockaddr_in6 *);
|
static int sock_eq(struct sockaddr_in6 *, struct sockaddr_in6 *);
|
||||||
|
|
||||||
/* Reachover. */
|
|
||||||
|
|
||||||
static void convaddr4to6(struct sockaddr_in6 *sa);
|
|
||||||
|
|
||||||
/* Public. */
|
/* Public. */
|
||||||
|
|
||||||
/* int
|
/* int
|
||||||
@@ -911,10 +907,12 @@ static int
|
|||||||
reopen (res_state statp, int *terrno, int ns)
|
reopen (res_state statp, int *terrno, int ns)
|
||||||
{
|
{
|
||||||
if (EXT(statp).nssocks[ns] == -1) {
|
if (EXT(statp).nssocks[ns] == -1) {
|
||||||
struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
|
struct sockaddr *nsap
|
||||||
|
= (struct sockaddr *) EXT(statp).nsaddrs[ns];
|
||||||
|
socklen_t slen;
|
||||||
|
|
||||||
/* only try IPv6 if IPv6 NS and if not failed before */
|
/* only try IPv6 if IPv6 NS and if not failed before */
|
||||||
if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) {
|
if (nsap->sa_family == AF_INET6 && !statp->ipv6_unavail) {
|
||||||
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
|
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
|
||||||
EXT(statp).nssocks[ns] =
|
EXT(statp).nssocks[ns] =
|
||||||
socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK,
|
socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK,
|
||||||
@@ -931,12 +929,8 @@ reopen (res_state statp, int *terrno, int ns)
|
|||||||
socket(PF_INET6, SOCK_DGRAM, 0);
|
socket(PF_INET6, SOCK_DGRAM, 0);
|
||||||
if (EXT(statp).nssocks[ns] < 0)
|
if (EXT(statp).nssocks[ns] < 0)
|
||||||
statp->ipv6_unavail = errno == EAFNOSUPPORT;
|
statp->ipv6_unavail = errno == EAFNOSUPPORT;
|
||||||
/* If IPv6 socket and nsap is IPv4, make it
|
slen = sizeof (struct sockaddr_in6);
|
||||||
IPv4-mapped */
|
} else if (nsap->sa_family == AF_INET) {
|
||||||
else if (nsap->sin6_family == AF_INET)
|
|
||||||
convaddr4to6(nsap);
|
|
||||||
}
|
|
||||||
if (EXT(statp).nssocks[ns] < 0) {
|
|
||||||
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
|
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
|
||||||
EXT(statp).nssocks[ns]
|
EXT(statp).nssocks[ns]
|
||||||
= socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK,
|
= socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK,
|
||||||
@@ -951,6 +945,7 @@ reopen (res_state statp, int *terrno, int ns)
|
|||||||
if (__builtin_expect (__have_o_nonblock < 0, 0))
|
if (__builtin_expect (__have_o_nonblock < 0, 0))
|
||||||
EXT(statp).nssocks[ns]
|
EXT(statp).nssocks[ns]
|
||||||
= socket(PF_INET, SOCK_DGRAM, 0);
|
= socket(PF_INET, SOCK_DGRAM, 0);
|
||||||
|
slen = sizeof (struct sockaddr_in);
|
||||||
}
|
}
|
||||||
if (EXT(statp).nssocks[ns] < 0) {
|
if (EXT(statp).nssocks[ns] < 0) {
|
||||||
*terrno = errno;
|
*terrno = errno;
|
||||||
@@ -969,10 +964,8 @@ reopen (res_state statp, int *terrno, int ns)
|
|||||||
* error message is received. We can thus detect
|
* error message is received. We can thus detect
|
||||||
* the absence of a nameserver without timing out.
|
* the absence of a nameserver without timing out.
|
||||||
*/
|
*/
|
||||||
if (connect(EXT(statp).nssocks[ns], (struct sockaddr *)nsap,
|
if (connect(EXT(statp).nssocks[ns], nsap, slen) < 0) {
|
||||||
sizeof *nsap) < 0) {
|
Aerror(statp, stderr, "connect(dg)", errno, nsap);
|
||||||
Aerror(statp, stderr, "connect(dg)", errno,
|
|
||||||
(struct sockaddr *) nsap);
|
|
||||||
__res_iclose(statp, false);
|
__res_iclose(statp, false);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -1415,22 +1408,3 @@ sock_eq(struct sockaddr_in6 *a1, struct sockaddr_in6 *a2) {
|
|||||||
(a1->sin6_addr.s6_addr32[3] ==
|
(a1->sin6_addr.s6_addr32[3] ==
|
||||||
((struct sockaddr_in *)a2)->sin_addr.s_addr));
|
((struct sockaddr_in *)a2)->sin_addr.s_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Converts IPv4 family, address and port to
|
|
||||||
* IPv6 family, IPv4-mapped IPv6 address and port.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
convaddr4to6(struct sockaddr_in6 *sa)
|
|
||||||
{
|
|
||||||
struct sockaddr_in *sa4p = (struct sockaddr_in *) sa;
|
|
||||||
in_port_t port = sa4p->sin_port;
|
|
||||||
in_addr_t addr = sa4p->sin_addr.s_addr;
|
|
||||||
|
|
||||||
sa->sin6_family = AF_INET6;
|
|
||||||
sa->sin6_port = port;
|
|
||||||
sa->sin6_addr.s6_addr32[0] = 0;
|
|
||||||
sa->sin6_addr.s6_addr32[1] = 0;
|
|
||||||
sa->sin6_addr.s6_addr32[2] = htonl(0xFFFF);
|
|
||||||
sa->sin6_addr.s6_addr32[3] = addr;
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user