mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
[BZ #4647]
Tomas Janousek <tjanouse@redhat.com> Ulrich Drepper <drepper@redhat.com> [BZ #4647] * resolv/res_send.c (send_dg): Remove socket_pf. Use ipv6_unavail member in __res_state, only convaddr4to6 if nssocks[ns] is a PF_INET6 socket. * resolv/resolv.h (__res_state): Add ipv6_unavail member. Make unused member a bitmap. * resolv/res_init.c (__res_vinit): Reset ipv6_unavail if IPv6 servers are configured. 2007-06-18 Jakub Jelinek <jakub@redhat.com>
This commit is contained in:
13
ChangeLog
13
ChangeLog
@ -1,3 +1,16 @@
|
|||||||
|
2007-06-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
Tomas Janousek <tjanouse@redhat.com>
|
||||||
|
Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
[BZ #4647]
|
||||||
|
* resolv/res_send.c (send_dg): Remove socket_pf. Use ipv6_unavail
|
||||||
|
member in __res_state, only convaddr4to6 if nssocks[ns] is a PF_INET6
|
||||||
|
socket.
|
||||||
|
* resolv/resolv.h (__res_state): Add ipv6_unavail member. Make
|
||||||
|
unused member a bitmap.
|
||||||
|
* resolv/res_init.c (__res_vinit): Reset ipv6_unavail if IPv6
|
||||||
|
servers are configured.
|
||||||
|
|
||||||
2007-06-18 Jakub Jelinek <jakub@redhat.com>
|
2007-06-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* elf/rtld.c (dl_main): Don't call init_tls more than once.
|
* elf/rtld.c (dl_main): Don't call init_tls more than once.
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
2007-06-18 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* pthreadP.h: Define PTHREAD_MUTEX_TYPE.
|
||||||
|
* phtread_mutex_lock.c: Use PTHREAD_MUTEX_TYPE.
|
||||||
|
* pthread_mutex_timedlock.c: Likewise.
|
||||||
|
* pthread_mutex_trylock.c: Likewise.
|
||||||
|
* pthread_mutex_unlock.c: Likewise.
|
||||||
|
|
||||||
2007-06-17 Andreas Schwab <schwab@suse.de>
|
2007-06-17 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
* sysdeps/pthread/pt-initfini.c: Tell gcc about the nonstandard
|
* sysdeps/pthread/pt-initfini.c: Tell gcc about the nonstandard
|
||||||
|
@ -97,6 +97,9 @@ enum
|
|||||||
= PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP
|
= PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PTHREAD_MUTEX_TYPE(m) \
|
||||||
|
((m)->__data.__kind)
|
||||||
|
|
||||||
/* Ceiling in __data.__lock. __data.__lock is signed, so don't
|
/* Ceiling in __data.__lock. __data.__lock is signed, so don't
|
||||||
use the MSB bit in there, but in the mask also include that bit,
|
use the MSB bit in there, but in the mask also include that bit,
|
||||||
so that the compiler can optimize & PTHREAD_MUTEX_PRIO_CEILING_MASK
|
so that the compiler can optimize & PTHREAD_MUTEX_PRIO_CEILING_MASK
|
||||||
|
@ -43,7 +43,8 @@ __pthread_mutex_lock (mutex)
|
|||||||
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
||||||
|
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP))
|
switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
|
||||||
|
PTHREAD_MUTEX_TIMED_NP))
|
||||||
{
|
{
|
||||||
/* Recursive mutex. */
|
/* Recursive mutex. */
|
||||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||||
|
@ -37,7 +37,8 @@ pthread_mutex_timedlock (mutex, abstime)
|
|||||||
/* We must not check ABSTIME here. If the thread does not block
|
/* We must not check ABSTIME here. If the thread does not block
|
||||||
abstime must not be checked for a valid value. */
|
abstime must not be checked for a valid value. */
|
||||||
|
|
||||||
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP))
|
switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
|
||||||
|
PTHREAD_MUTEX_TIMED_NP))
|
||||||
{
|
{
|
||||||
/* Recursive mutex. */
|
/* Recursive mutex. */
|
||||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||||
|
@ -31,7 +31,8 @@ __pthread_mutex_trylock (mutex)
|
|||||||
int oldval;
|
int oldval;
|
||||||
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
||||||
|
|
||||||
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP))
|
switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
|
||||||
|
PTHREAD_MUTEX_TIMED_NP))
|
||||||
{
|
{
|
||||||
/* Recursive mutex. */
|
/* Recursive mutex. */
|
||||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||||
|
@ -31,7 +31,8 @@ __pthread_mutex_unlock_usercnt (mutex, decr)
|
|||||||
{
|
{
|
||||||
int newowner = 0;
|
int newowner = 0;
|
||||||
|
|
||||||
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP))
|
switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
|
||||||
|
PTHREAD_MUTEX_TIMED_NP))
|
||||||
{
|
{
|
||||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||||
/* Recursive mutex. */
|
/* Recursive mutex. */
|
||||||
|
@ -241,8 +241,8 @@ __res_vinit(res_state statp, int preinit) {
|
|||||||
line[sizeof(name) - 1] == '\t'))
|
line[sizeof(name) - 1] == '\t'))
|
||||||
|
|
||||||
if ((fp = fopen(_PATH_RESCONF, "rc")) != NULL) {
|
if ((fp = fopen(_PATH_RESCONF, "rc")) != NULL) {
|
||||||
/* No threads use this stream. */
|
/* No threads use this stream. */
|
||||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||||
/* read the config file */
|
/* read the config file */
|
||||||
while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) {
|
while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) {
|
||||||
/* skip comments */
|
/* skip comments */
|
||||||
@ -397,8 +397,11 @@ __res_vinit(res_state statp, int preinit) {
|
|||||||
if (nserv > 1)
|
if (nserv > 1)
|
||||||
statp->nscount = nserv;
|
statp->nscount = nserv;
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
if (nservall - nserv > 0)
|
if (nservall - nserv > 0) {
|
||||||
statp->_u._ext.nscount6 = nservall - nserv;
|
statp->_u._ext.nscount6 = nservall - nserv;
|
||||||
|
/* We try IPv6 servers again. */
|
||||||
|
statp->ipv6_unavail = false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef RESOLVSORT
|
#ifdef RESOLVSORT
|
||||||
statp->nsort = nsort;
|
statp->nsort = nsort;
|
||||||
|
@ -813,17 +813,20 @@ send_dg(res_state statp,
|
|||||||
struct pollfd pfd[1];
|
struct pollfd pfd[1];
|
||||||
int ptimeout;
|
int ptimeout;
|
||||||
struct sockaddr_in6 from;
|
struct sockaddr_in6 from;
|
||||||
static int socket_pf = 0;
|
|
||||||
socklen_t fromlen;
|
socklen_t fromlen;
|
||||||
int resplen, seconds, n;
|
int resplen, seconds, n;
|
||||||
|
|
||||||
if (EXT(statp).nssocks[ns] == -1) {
|
if (EXT(statp).nssocks[ns] == -1) {
|
||||||
/* 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) && (socket_pf != PF_INET)) {
|
if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) {
|
||||||
EXT(statp).nssocks[ns] =
|
EXT(statp).nssocks[ns] =
|
||||||
socket(PF_INET6, SOCK_DGRAM, 0);
|
socket(PF_INET6, SOCK_DGRAM, 0);
|
||||||
socket_pf = EXT(statp).nssocks[ns] < 0 ? PF_INET
|
if (EXT(statp).nssocks[ns] < 0)
|
||||||
: PF_INET6;
|
statp->ipv6_unavail = errno == EAFNOSUPPORT;
|
||||||
|
/* If IPv6 socket and nsap is IPv4, make it
|
||||||
|
IPv4-mapped */
|
||||||
|
else if (nsap->sin6_family == AF_INET)
|
||||||
|
convaddr4to6(nsap);
|
||||||
}
|
}
|
||||||
if (EXT(statp).nssocks[ns] < 0)
|
if (EXT(statp).nssocks[ns] < 0)
|
||||||
EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0);
|
EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0);
|
||||||
@ -832,9 +835,7 @@ send_dg(res_state statp,
|
|||||||
Perror(statp, stderr, "socket(dg)", errno);
|
Perror(statp, stderr, "socket(dg)", errno);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
/* If IPv6 socket and nsap is IPv4, make it IPv4-mapped */
|
|
||||||
if ((socket_pf == PF_INET6) && (nsap->sin6_family == AF_INET))
|
|
||||||
convaddr4to6(nsap);
|
|
||||||
/*
|
/*
|
||||||
* On a 4.3BSD+ machine (client and server,
|
* On a 4.3BSD+ machine (client and server,
|
||||||
* actually), sending to a nameserver datagram
|
* actually), sending to a nameserver datagram
|
||||||
|
@ -110,21 +110,25 @@ struct __res_state {
|
|||||||
nsaddr_list[MAXNS]; /* address of name server */
|
nsaddr_list[MAXNS]; /* address of name server */
|
||||||
# define nsaddr nsaddr_list[0] /* for backward compatibility */
|
# define nsaddr nsaddr_list[0] /* for backward compatibility */
|
||||||
u_short id; /* current message id */
|
u_short id; /* current message id */
|
||||||
|
/* 2 byte hole here. */
|
||||||
char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
|
char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
|
||||||
char defdname[256]; /* default domain (deprecated) */
|
char defdname[256]; /* default domain (deprecated) */
|
||||||
u_long pfcode; /* RES_PRF_ flags - see below. */
|
u_long pfcode; /* RES_PRF_ flags - see below. */
|
||||||
unsigned ndots:4; /* threshold for initial abs. query */
|
unsigned ndots:4; /* threshold for initial abs. query */
|
||||||
unsigned nsort:4; /* number of elements in sort_list[] */
|
unsigned nsort:4; /* number of elements in sort_list[] */
|
||||||
char unused[3];
|
unsigned ipv6_unavail:1; /* connecting to IPv6 server failed */
|
||||||
|
unsigned unused:23;
|
||||||
struct {
|
struct {
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
u_int32_t mask;
|
u_int32_t mask;
|
||||||
} sort_list[MAXRESOLVSORT];
|
} sort_list[MAXRESOLVSORT];
|
||||||
|
/* 4 byte hole here on 64-bit architectures. */
|
||||||
res_send_qhook qhook; /* query hook */
|
res_send_qhook qhook; /* query hook */
|
||||||
res_send_rhook rhook; /* response hook */
|
res_send_rhook rhook; /* response hook */
|
||||||
int res_h_errno; /* last one set for this context */
|
int res_h_errno; /* last one set for this context */
|
||||||
int _vcsock; /* PRIVATE: for res_send VC i/o */
|
int _vcsock; /* PRIVATE: for res_send VC i/o */
|
||||||
u_int _flags; /* PRIVATE: see below */
|
u_int _flags; /* PRIVATE: see below */
|
||||||
|
/* 4 byte hole here on 64-bit architectures. */
|
||||||
union {
|
union {
|
||||||
char pad[52]; /* On an i386 this means 512b total. */
|
char pad[52]; /* On an i386 this means 512b total. */
|
||||||
struct {
|
struct {
|
||||||
|
Reference in New Issue
Block a user