mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/virt-viewer
synced 2026-01-03 15:39:31 +00:00
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
This commit is contained in:
parent
c2eb85c712
commit
5a07c59e8f
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user