From: "Richard W.M. Jones" <rjones@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, jcody@redhat.com, qemu-block@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] block/ssh: Avoid segfault if inet_connect doesn't set errno.
Date: Wed, 22 Jul 2015 14:03:12 +0100 [thread overview]
Message-ID: <20150722130312.GA22921@redhat.com> (raw)
In-Reply-To: <1437566873-28782-1-git-send-email-rjones@redhat.com>
On Wed, Jul 22, 2015 at 01:07:53PM +0100, Richard W.M. Jones wrote:
> On some (but not all) systems:
>
> $ qemu-img create -f qcow2 overlay -b ssh://xen/
> Segmentation fault
>
> It turns out this happens when inet_connect returns NULL in the
> following code, but errno is not set (0).
Bleah .. not NULL, -1. I'm going to send an updated v2
patch which will just fix the message.
Rich.
> s->sock = inet_connect(s->hostport, errp);
> if (s->sock < 0) {
> ret = -errno;
> goto err;
> }
>
> In the case above, 'xen' doesn't exist so getaddrinfo fails. On
> Fedora 22, getaddrinfo happens to set errno = ENOENT (although it is
> _not_ documented to do that), so it doesn't segfault.
>
> On RHEL 7, errno is not set by the failing getaddrinfo, so ret == 0,
> so the caller doesn't know there was an error and continues with a
> half-initialized BDRVSSHState struct, and everything goes south from
> there.
>
> Fix this by setting errno to EINVAL. The real error is saved in the
> Error** errp struct, so it is printed correctly:
>
> $ ./qemu-img create -f qcow2 overlay -b ssh://xen/
> qemu-img: overlay: address resolution failed for xen:22: No address associated with hostname
>
> BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1147343
> Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
> ---
> block/ssh.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/block/ssh.c b/block/ssh.c
> index aebb18c..8d4dc2a 100644
> --- a/block/ssh.c
> +++ b/block/ssh.c
> @@ -563,7 +563,7 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options,
> /* Open the socket and connect. */
> s->sock = inet_connect(s->hostport, errp);
> if (s->sock < 0) {
> - ret = -errno;
> + ret = -EINVAL;
> goto err;
> }
>
> --
> 2.4.3
>
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/
prev parent reply other threads:[~2015-07-22 13:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-22 12:07 [Qemu-devel] [PATCH] block/ssh: Avoid segfault if inet_connect doesn't set errno Richard W.M. Jones
2015-07-22 13:03 ` Richard W.M. Jones [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=20150722130312.GA22921@redhat.com \
--to=rjones@redhat.com \
--cc=jcody@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.