diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index dc4a86344683b39afed520e9289bc692a1be75e3..2506b89a6a1154de478c7d5a00d40cbf44fcc6a3 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -10269,6 +10269,18 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd)
listen_addr = virXPathString("string(/domain/devices/graphics"
"[@type='vnc']/@listen)", ctxt);
+ if (!listen_addr) {
+ /* The subelement address - -
+ * *should* have been automatically backfilled into its
+ * parent (which we just tried to
+ * retrieve into listen_addr above) but in some cases it
+ * isn't, so we also do an explicit check for the
+ * subelement (which, by the way, doesn't exist on libvirt
+ * < 0.9.4, so we really do need to check both places)
+ */
+ listen_addr = virXPathString("string(/domain/devices/graphics"
+ "[@type='vnc']/listen/@address)", ctxt);
+ }
if (listen_addr == NULL || STREQ(listen_addr, "0.0.0.0"))
vshPrint(ctl, ":%d\n", port-5900);
else