diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2014-06-19 18:32:40 +0200 |
---|---|---|
committer | Jonathon Jongsma <jjongsma@redhat.com> | 2015-01-06 15:38:09 -0600 |
commit | 5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6 (patch) | |
tree | 869a356da4ce2f77cdc2434f84f8419983249875 /src/virt-viewer.c | |
parent | c2eb85c712ba4267202468d8d226d181f0d6bb30 (diff) | |
download | virt-viewer-5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6.tar.gz virt-viewer-5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6.tar.xz virt-viewer-5a07c59e8f72d1fe630d99a5f2d6e0bb3a459ec6.zip |
virt-viewer: Don't connect to localhost displays with qemu+tcp://
When connecting to a remote libvirt instance, a VM may only be listening
on localhost for SPICE/VNC connections. In such a situation, virt-viewer
then tries to connect to localhost, which is not correct as this
'localhost' referred to the remote libvirt host it connected to.
This commit adds a couple of tests on the libvirt URI used and the
<graphics> listen address to error out in this situation.
Resolves: rhbz#1108523
Diffstat (limited to 'src/virt-viewer.c')
-rw-r--r-- | src/virt-viewer.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/virt-viewer.c b/src/virt-viewer.c index 51e91c6..59fa257 100644 --- a/src/virt-viewer.c +++ b/src/virt-viewer.c @@ -334,6 +334,55 @@ virt_viewer_replace_host(const gchar *host) return ret; } + +static gboolean +virt_viewer_is_loopback(const char *host) +{ + GInetAddress *addr = NULL; + gboolean is_loopback = FALSE; + + g_return_val_if_fail(host != NULL, FALSE); + + addr = g_inet_address_new_from_string(host); + if (!addr) /* Parsing error means it was probably a hostname */ + return (strcmp(host, "localhost") == 0); + + is_loopback = g_inet_address_get_is_loopback(addr); + g_object_unref(addr); + + return is_loopback; +} + + +static gboolean +virt_viewer_is_reachable(const gchar *host, const char *transport, + const char *transport_host) +{ + gboolean host_is_loopback; + gboolean transport_is_loopback; + + if (!host) + return FALSE; + + if (!transport) + return TRUE; + + if (strcmp(transport, "ssh") == 0) + return TRUE; + + if (strcmp(transport, "unix") == 0) + return TRUE; + + host_is_loopback = virt_viewer_is_loopback(host); + transport_is_loopback = virt_viewer_is_loopback(transport_host); + + if (transport_is_loopback && host_is_loopback) + return TRUE; + else + return !host_is_loopback; +} + + static gboolean virt_viewer_extract_connect_info(VirtViewer *self, virDomainPtr dom) @@ -420,6 +469,14 @@ virt_viewer_extract_connect_info(VirtViewer *self, ghost = replacement_host; } + if (!virt_viewer_is_reachable(ghost, transport, host)) { + g_debug("graphics listen '%s' is not reachable from this machine", + ghost ? ghost : ""); + virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"), + priv->domkey); + goto cleanup; + } + virt_viewer_app_set_connect_info(app, host, ghost, gport, gtlsport,transport, unixsock, user, port, NULL); retval = TRUE; |