diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b46cd2a64f..d8bed670f2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -21342,7 +21342,11 @@ virDomainGraphicsDefFormat(virBufferPtr buf, switch (def->type) { case VIR_DOMAIN_GRAPHICS_TYPE_VNC: if (def->data.vnc.socket) { - virBufferEscapeString(buf, " socket='%s'", def->data.vnc.socket); + if (!def->data.vnc.socketAutogenerated || + !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)) { + virBufferEscapeString(buf, " socket='%s'", + def->data.vnc.socket); + } } else { if (def->data.vnc.port && (!def->data.vnc.autoport || !(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE))) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ee66e6d6aa..31e7a86d47 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1564,6 +1564,7 @@ struct _virDomainGraphicsDef { bool autoport; char *keymap; char *socket; + bool socketAutogenerated; virDomainGraphicsAuthDef auth; int sharePolicy; } vnc; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9597b307e9..6fbfe215bf 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7277,10 +7277,13 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg, } if (graphics->data.vnc.socket || cfg->vncAutoUnixSocket) { - if (!graphics->data.vnc.socket && - virAsprintf(&graphics->data.vnc.socket, - "%s/vnc.sock", domainLibDir) == -1) - goto error; + if (!graphics->data.vnc.socket) { + if (virAsprintf(&graphics->data.vnc.socket, + "%s/vnc.sock", domainLibDir) < 0) + goto error; + + graphics->data.vnc.socketAutogenerated = true; + } virBufferAsprintf(&opt, "unix:%s", graphics->data.vnc.socket); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a2f9810439..6262bfee47 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1659,10 +1659,32 @@ qemuCanonicalizeMachine(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) } +static void +qemuDomainRecheckInternalPaths(virDomainDefPtr def, + virQEMUDriverConfigPtr cfg, + unsigned int flags) +{ + size_t i = 0; + + for (i = 0; i < def->ngraphics; ++i) { + virDomainGraphicsDefPtr graphics = def->graphics[i]; + + if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC && + graphics->data.vnc.socket && + STRPREFIX(graphics->data.vnc.socket, cfg->libDir)) { + if (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) + VIR_FREE(graphics->data.vnc.socket); + else + graphics->data.vnc.socketAutogenerated = true; + } + } +} + + static int qemuDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, - unsigned int parseFlags ATTRIBUTE_UNUSED, + unsigned int parseFlags, void *opaque) { virQEMUDriverPtr driver = opaque; @@ -1708,6 +1730,8 @@ qemuDomainDefPostParse(virDomainDefPtr def, qemuDomainDefEnableDefaultFeatures(def); + qemuDomainRecheckInternalPaths(def, cfg, parseFlags); + if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-autosocket.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-autosocket.args new file mode 100644 index 0000000000..7e1fb6b371 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-autosocket.args @@ -0,0 +1,22 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu \ +-name QEMUGuest1 \ +-S \ +-M pc \ +-m 214 \ +-smp 1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nodefaults \ +-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \ +-no-acpi \ +-boot c \ +-usb \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ +-vnc unix:/tmp/lib/domain--1-QEMUGuest1/vnc.socket \ +-vga cirrus diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-autosocket.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-autosocket.xml new file mode 100644 index 0000000000..fa59c39873 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-autosocket.xml @@ -0,0 +1,34 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + + + + + + + diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-autosocket.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-autosocket.xml new file mode 100644 index 0000000000..7440533687 --- /dev/null +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-autosocket.xml @@ -0,0 +1,39 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + +
+ + +
+ + + + + +