From: "Daniel P. Berrange" <berrange@redhat.com>
To: "Antonio Huete Jiménez" <tuxillo@quantumachine.net>
Cc: qemu-devel@nongnu.org, kraxel@redhat.com, pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH] sockets: Fix test for DragonFly BSD
Date: Tue, 19 Dec 2017 10:30:11 +0000 [thread overview]
Message-ID: <20171219103011.GB32479@redhat.com> (raw)
In-Reply-To: <20171219002105.Horde.McUB5OjQ4CcwjyzfFEIWM2V@www.quantumachine.net>
On Tue, Dec 19, 2017 at 12:21:05AM +0000, Antonio Huete Jiménez wrote:
> From f57cdc7ec2d5a5e906fa8b795eeede2d7b66aa56 Mon Sep 17 00:00:00 2001
> From: Antonio Huete Jimenez <tuxillo@quantumachine.net>
> Date: Fri, 15 Dec 2017 01:08:10 +0100
> Subject: [PATCH] sockets: Fix test for DragonFly BSD
>
> DragonFly BSD does not implement AI_V4MAPPED for its getaddrinfo() so
> probe and discard that flag instead of aborting the test.
>
> Test that fails:
> ERROR:tests/test-char.c:448:char_udp_test_internal: 'chr' should not be
> NULL
>
> Signed-off-by: Antonio Huete Jimenez <tuxillo@quantumachine.net>
> ---
> util/qemu-sockets.c | 25 ++++++++++++++++++++++---
> 1 file changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
> index af4f01211a..5a9c55c303 100644
> --- a/util/qemu-sockets.c
> +++ b/util/qemu-sockets.c
> @@ -43,6 +43,8 @@
> # define AI_NUMERICSERV 0
> #endif
>
> +int useV4Mapped = 1;
> +
>
> static int inet_getport(struct addrinfo *e)
> {
> @@ -383,7 +385,6 @@ 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));
>
> @@ -474,7 +475,11 @@ static int inet_dgram_saddr(InetSocketAddress *sraddr,
>
> /* lookup peer addr */
> 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(sraddr, &err);
> ai.ai_socktype = SOCK_DGRAM;
>
> @@ -493,7 +498,21 @@ static int inet_dgram_saddr(InetSocketAddress *sraddr,
> goto err;
> }
>
> - if ((rc = getaddrinfo(addr, port, &ai, &peer)) != 0) {
> + /* lookup */
> + rc = getaddrinfo(addr, port, &ai, &peer);
> +
> + /* 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(addr, port, &ai, &peer);
> + }
Rather than duplicating this repeated calls to getaddrinfo in multiple
methods, I think it would be better to define a wrapper method. ie
create a 'qemu_getaddrinfo()' method in this file that does the magic
re-try without AI_V4MAPPED. Export it in include/qemu/sockets.h too.
Then call that from all places in QEMU that currently use getaddrinfo()
directly - there are 5 in this file, another in io/dns-resolver.c,
and some more in net/ & test/. That way we are't going to mistakely
reintroduce the bug in other places later.
We should probably also move the #ifdef AI_* code into qemu/sockets.h
too, so we can remove the duplication in test suites.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
prev parent reply other threads:[~2017-12-19 10:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-19 0:21 [Qemu-devel] [PATCH] sockets: Fix test for DragonFly BSD Antonio Huete Jiménez
2017-12-19 10:30 ` Daniel P. Berrange [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171219103011.GB32479@redhat.com \
--to=berrange@redhat.com \
--cc=kraxel@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=tuxillo@quantumachine.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.