[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 07/15] util: retry getaddrinfo if getting EAI_BADFLAG
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 07/15] util: retry getaddrinfo if getting EAI_BADFLAGS with AI_V4MAPPED |
Date: |
Tue, 5 Apr 2016 11:50:10 +0200 |
From: "Daniel P. Berrange" <address@hidden>
The FreeBSD header files define the AI_V4MAPPED but its
implementation of getaddrinfo() always returns an error
when that flag is set. eg
address resolution failed for localhost:9000: Invalid value for ai_flags
There are also reports of the same problem on OS-X 10.6
Since AI_V4MAPPED is not critical functionality, if we
get an EAI_BADFLAGS error then just retry without the
AI_V4MAPPED flag set. Use a static var to cache this
status so we don't have to retry on every single call.
Also remove its use from the test suite since it serves
no useful purpose there.
Signed-off-by: Daniel P. Berrange <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
tests/test-io-channel-socket.c | 5 +----
util/qemu-sockets.c | 19 ++++++++++++++++++-
2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
index 9d94adb..855306b 100644
--- a/tests/test-io-channel-socket.c
+++ b/tests/test-io-channel-socket.c
@@ -27,9 +27,6 @@
#ifndef AI_ADDRCONFIG
# define AI_ADDRCONFIG 0
#endif
-#ifndef AI_V4MAPPED
-# define AI_V4MAPPED 0
-#endif
#ifndef EAI_ADDRFAMILY
# define EAI_ADDRFAMILY 0
#endif
@@ -42,7 +39,7 @@ static int check_bind(const char *hostname, bool *has_proto)
int ret = -1;
memset(&ai, 0, sizeof(ai));
- ai.ai_flags = AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG;
+ ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
ai.ai_family = AF_UNSPEC;
ai.ai_socktype = SOCK_STREAM;
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index b87e17f..0d53691 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -29,6 +29,7 @@
#ifndef AI_ADDRCONFIG
# define AI_ADDRCONFIG 0
#endif
+
#ifndef AI_V4MAPPED
# define AI_V4MAPPED 0
#endif
@@ -354,10 +355,14 @@ static struct addrinfo
*inet_parse_connect_saddr(InetSocketAddress *saddr,
struct addrinfo ai, *res;
int rc;
Error *err = NULL;
+ static int useV4Mapped = 1;
memset(&ai, 0, sizeof(ai));
- ai.ai_flags = AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG;
+ ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
+ if (atomic_read(&useV4Mapped)) {
+ ai.ai_flags |= AI_V4MAPPED;
+ }
ai.ai_family = inet_ai_family_from_address(saddr, &err);
ai.ai_socktype = SOCK_STREAM;
@@ -373,6 +378,18 @@ static struct addrinfo
*inet_parse_connect_saddr(InetSocketAddress *saddr,
/* lookup */
rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
+
+ /* At least FreeBSD and OS-X 10.6 declare AI_V4MAPPED but
+ * then don't implement it in their getaddrinfo(). Detect
+ * this and retry without the flag since that's preferrable
+ * to a fatal error
+ */
+ if (rc == EAI_BADFLAGS &&
+ (ai.ai_flags & AI_V4MAPPED)) {
+ atomic_set(&useV4Mapped, 0);
+ ai.ai_flags &= ~AI_V4MAPPED;
+ rc = getaddrinfo(saddr->host, saddr->port, &ai, &res);
+ }
if (rc != 0) {
error_setg(errp, "address resolution failed for %s:%s: %s",
saddr->host, saddr->port, gai_strerror(rc));
--
2.5.5
- [Qemu-devel] [PULL 04/15] target-i386: do not pass MSR_TSC_AUX to KVM ioctls if CPUID bit is not set, (continued)
- [Qemu-devel] [PULL 04/15] target-i386: do not pass MSR_TSC_AUX to KVM ioctls if CPUID bit is not set, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 02/15] target-i386/kvm: Hyper-V VMBus hypercalls blank handlers, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 03/15] memory: fix segv on qemu_ram_free(block=0x0), Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 01/15] update Linux headers to 4.6, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 05/15] target-i386: assert that KVM_GET/SET_MSRS can set all requested MSRs, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 09/15] char: ensure all clients are in non-blocking mode, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 08/15] char: fix broken EAGAIN retry on OS-X due to errno clobbering, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 10/15] doc/memory: update MMIO section, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 07/15] util: retry getaddrinfo if getting EAI_BADFLAGS with AI_V4MAPPED,
Paolo Bonzini <=
- [Qemu-devel] [PULL 11/15] nbd: don't request FUA on FLUSH, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 06/15] checkpatch: add target_ulong to typelist, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 14/15] nbd: Fix poor debug message, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 12/15] cpus: don't use atomic_read for vm_clock_warp_start, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 13/15] include/qemu/atomic: add compile time asserts, Paolo Bonzini, 2016/04/05
- [Qemu-devel] [PULL 15/15] net: fix missing include of qapi/error.h in netmap.c, Paolo Bonzini, 2016/04/05
- Re: [Qemu-devel] [PULL 00/15] Misc changes for QEMU 2.6.0-rc1, Peter Maydell, 2016/04/05