[libvirt] [PATCH v3 0/6] qemu: handle ',' and '=' in VM name

This series adds qemu cli comma escaping to several places that are dependent on the VM name, to enable names with embedded commas. Patch 6 makes use of qemu -name guest=X value to allow names with '=' in them. https://bugzilla.redhat.com/show_bug.cgi?id=639926 https://bugzilla.redhat.com/show_bug.cgi?id=1276485 Note: There's likely other places that are VM name dependent that need comma escaping too, but this hits the mandatory ones. I've listed some more on the BiteSizedTasks page: http://wiki.libvirt.org/page/BiteSizedTasks#qemu:_Use_comma_escaping_for_mor... v3: Patch 1 and patch 4 are new Cole Robinson (6): qemu: command: Add qemuBufferEscapeComma qemu: command: escape commas in VM name qemu: command: escape commas in secret master path qemu: command: escape commas in VNC socket path qemu: command: escape commas in chardev socket path qemu: command: Use -name guest= if available src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 50 ++++++++++++++++------ tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml | 1 + tests/qemucaps2xmldata/all_1.6.0-1.caps | 1 + tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps | 1 + .../qemuxml2argvdata/qemuxml2argv-name-escape.args | 25 +++++++++++ .../qemuxml2argvdata/qemuxml2argv-name-escape.xml | 19 ++++++++ tests/qemuxml2argvtest.c | 3 ++ 15 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml -- 2.7.4

Centralize the magic invocation for escaping commas on the qemu command line, and document it a bit --- src/qemu/qemu_command.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 2966b07..e400e5f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -149,6 +149,22 @@ VIR_ENUM_IMPL(qemuNumaPolicy, VIR_DOMAIN_NUMATUNE_MEM_LAST, "preferred", "interleave"); + +/** + * qemuBufferEscapeComma: + * @buf: buffer to append the escaped string + * @str: the string to escape + * + * qemu requires that any values passed on the command line which contain + * a ',' must escape it using an extra ',' as the escape character + */ +static void +qemuBufferEscapeComma(virBufferPtr buf, const char *str) +{ + virBufferEscape(buf, ',', ",", "%s", str); +} + + /** * qemuBuildHasMasterKey: * @qemuCaps: QEMU binary capabilities @@ -1213,7 +1229,8 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, break; } - virBufferEscape(&opt, ',', ",", "%s,", source); + qemuBufferEscapeComma(&opt, source); + virBufferAddLit(&opt, ","); if (disk->src->format > 0 && disk->src->type != VIR_STORAGE_TYPE_DIR) @@ -3785,7 +3802,7 @@ qemuBuildVirtioInputDevStr(const virDomainDef *def, goto error; } virBufferAsprintf(&buf, "virtio-input-host%s,id=%s,evdev=", suffix, dev->info.alias); - virBufferEscape(&buf, ',', ",", "%s", dev->source.evdev); + qemuBufferEscapeComma(&buf, dev->source.evdev); break; case VIR_DOMAIN_INPUT_TYPE_LAST: break; @@ -9086,10 +9103,10 @@ qemuBuildTPMBackendStr(const virDomainDef *def, goto error; } virBufferAddLit(&buf, ",path="); - virBufferEscape(&buf, ',', ",", "%s", devset ? devset : tpmdev); + qemuBufferEscapeComma(&buf, devset ? devset : tpmdev); virBufferAddLit(&buf, ",cancel-path="); - virBufferEscape(&buf, ',', ",", "%s", cancel_path); + qemuBufferEscapeComma(&buf, cancel_path); VIR_FREE(devset); VIR_FREE(cancel_path); -- 2.7.4

This isn't sufficient on its own, since the VM name is used for things like monitor paths, which we don't escape yet --- src/qemu/qemu_command.c | 2 +- .../qemuxml2argvdata/qemuxml2argv-name-escape.args | 24 ++++++++++++++++++++++ .../qemuxml2argvdata/qemuxml2argv-name-escape.xml | 18 ++++++++++++++++ tests/qemuxml2argvtest.c | 2 ++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e400e5f..6ed7ae5 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6869,7 +6869,7 @@ qemuBuildNameCommandLine(virCommandPtr cmd, virCommandAddArg(cmd, "-name"); - virBufferAsprintf(&buf, "%s", def->name); + qemuBufferEscapeComma(&buf, def->name); if (cfg->setProcessName && virQEMUCapsGet(qemuCaps, QEMU_CAPS_NAME_PROCESS)) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args new file mode 100644 index 0000000..94a3133 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args @@ -0,0 +1,24 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/home/test \ +USER=test \ +LOGNAME=test \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu \ +-name foo,,bar,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo,\ +bar/master-key.aes \ +-M pc \ +-m 214 \ +-smp 1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo,bar/monitor.sock,\ +server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=readline \ +-no-acpi \ +-boot c \ +-usb \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml new file mode 100644 index 0000000..3a8c3cd --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml @@ -0,0 +1,18 @@ +<domain type='qemu'> + <name>foo,bar</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index e41444d..d8834cb 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1893,6 +1893,8 @@ mymain(void) VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS, NONE); + DO_TEST("name-escape", QEMU_CAPS_NAME_DEBUG_THREADS, + QEMU_CAPS_OBJECT_SECRET, QEMU_CAPS_CHARDEV); DO_TEST("debug-threads", QEMU_CAPS_NAME_DEBUG_THREADS); DO_TEST("master-key", QEMU_CAPS_OBJECT_SECRET); -- 2.7.4

Need to convert the local function to virBuffer usage, so we can use qemuBufferEscapeComma --- src/qemu/qemu_command.c | 7 +++++-- tests/qemuxml2argvdata/qemuxml2argv-name-escape.args | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6ed7ae5..067a8c3 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -196,6 +196,7 @@ qemuBuildMasterKeyCommandLine(virCommandPtr cmd, int ret = -1; char *alias = NULL; char *path = NULL; + virBuffer buf = VIR_BUFFER_INITIALIZER; /* If the -object secret does not exist, then just return. This just * means the domain won't be able to use a secret master key and is @@ -218,12 +219,14 @@ qemuBuildMasterKeyCommandLine(virCommandPtr cmd, goto cleanup; virCommandAddArg(cmd, "-object"); - virCommandAddArgFormat(cmd, "secret,id=%s,format=raw,file=%s", - alias, path); + virBufferAsprintf(&buf, "secret,id=%s,format=raw,file=", alias); + qemuBufferEscapeComma(&buf, path); + virCommandAddArgBuffer(cmd, &buf); ret = 0; cleanup: + virBufferFreeAndReset(&buf); VIR_FREE(alias); VIR_FREE(path); return ret; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args index 94a3133..a5e35b8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args @@ -7,7 +7,7 @@ QEMU_AUDIO_DRV=none \ /usr/bin/qemu \ -name foo,,bar,debug-threads=on \ -S \ --object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo,\ +-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo,,\ bar/master-key.aes \ -M pc \ -m 214 \ -- 2.7.4

This path can be dependent on the VM libdir, which contains its name --- src/qemu/qemu_command.c | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-name-escape.args | 3 ++- tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml | 1 + tests/qemuxml2argvtest.c | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 067a8c3..22fb51c 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7427,7 +7427,8 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg, graphics->data.vnc.socketAutogenerated = true; } - virBufferAsprintf(&opt, "unix:%s", graphics->data.vnc.socket); + virBufferAddLit(&opt, "unix:"); + qemuBufferEscapeComma(&opt, graphics->data.vnc.socket); } else { if (!graphics->data.vnc.autoport && diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args index a5e35b8..ffec3f4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args @@ -13,7 +13,6 @@ bar/master-key.aes \ -m 214 \ -smp 1 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ --nographic \ -nodefaults \ -chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo,bar/monitor.sock,\ server,nowait \ @@ -21,4 +20,6 @@ server,nowait \ -no-acpi \ -boot c \ -usb \ +-vnc unix:/tmp/bar,,foo.sock \ +-vga cirrus \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml index 3a8c3cd..e263553 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml @@ -14,5 +14,6 @@ <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu</emulator> + <graphics type='vnc' socket='/tmp/bar,foo.sock'/> </devices> </domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index d8834cb..5d15dfd 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1894,7 +1894,7 @@ mymain(void) NONE); DO_TEST("name-escape", QEMU_CAPS_NAME_DEBUG_THREADS, - QEMU_CAPS_OBJECT_SECRET, QEMU_CAPS_CHARDEV); + QEMU_CAPS_OBJECT_SECRET, QEMU_CAPS_CHARDEV, QEMU_CAPS_VNC); DO_TEST("debug-threads", QEMU_CAPS_NAME_DEBUG_THREADS); DO_TEST("master-key", QEMU_CAPS_OBJECT_SECRET); -- 2.7.4

After this, a default virt-manager VM will startup with a comma in the VM name: https://bugzilla.redhat.com/show_bug.cgi?id=639926 --- src/qemu/qemu_command.c | 9 ++++----- tests/qemuxml2argvdata/qemuxml2argv-name-escape.args | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 22fb51c..6b89508 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4914,11 +4914,10 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager, break; case VIR_DOMAIN_CHR_TYPE_UNIX: - virBufferAsprintf(&buf, - "socket,id=char%s,path=%s%s", - alias, - dev->data.nix.path, - dev->data.nix.listen ? ",server,nowait" : ""); + virBufferAsprintf(&buf, "socket,id=char%s,path=", alias); + qemuBufferEscapeComma(&buf, dev->data.nix.path); + if (dev->data.nix.listen) + virBufferAddLit(&buf, ",server,nowait"); break; case VIR_DOMAIN_CHR_TYPE_SPICEVMC: diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args index ffec3f4..b50b8c4 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args @@ -14,7 +14,7 @@ bar/master-key.aes \ -smp 1 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ -nodefaults \ --chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo,bar/monitor.sock,\ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo,,bar/monitor.sock,\ server,nowait \ -mon chardev=charmonitor,id=monitor,mode=readline \ -no-acpi \ -- 2.7.4

-name guest= is the explicit parameter for passing a VM name. Using it is required to allow a VM with an '=' in the name https://bugzilla.redhat.com/show_bug.cgi?id=1276485 --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 4 ++++ tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml | 1 + tests/qemucaps2xmldata/all_1.6.0-1.caps | 1 + tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps | 1 + tests/qemuxml2argvdata/qemuxml2argv-name-escape.args | 8 ++++---- tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml | 2 +- tests/qemuxml2argvtest.c | 3 ++- 15 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 30dc33a..610c6af 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -328,6 +328,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "device-tray-moved-event", "nec-usb-xhci-ports", "virtio-scsi-pci.iothread", + "name-guest", ); @@ -2666,6 +2667,7 @@ static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = { { "spice", "gl", QEMU_CAPS_SPICE_GL }, { "chardev", "logfile", QEMU_CAPS_CHARDEV_LOGFILE }, { "name", "debug-threads", QEMU_CAPS_NAME_DEBUG_THREADS }, + { "name", "guest", QEMU_CAPS_NAME_GUEST }, }; static int diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index e7d0a60..9145f2d 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -359,6 +359,7 @@ typedef enum { QEMU_CAPS_DEVICE_TRAY_MOVED, /* DEVICE_TRAY_MOVED event */ QEMU_CAPS_NEC_USB_XHCI_PORTS, /* -device nec-usb-xhci.p3 ports setting */ QEMU_CAPS_VIRTIO_SCSI_IOTHREAD, /* virtio-scsi-{pci,ccw}.iothread */ + QEMU_CAPS_NAME_GUEST, /* -name guest= */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6b89508..0461a2f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6871,6 +6871,10 @@ qemuBuildNameCommandLine(virCommandPtr cmd, virCommandAddArg(cmd, "-name"); + /* The 'guest' option let's us handle a name with '=' embedded in it */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NAME_GUEST)) + virBufferAddLit(&buf, "guest="); + qemuBufferEscapeComma(&buf, def->name); if (cfg->setProcessName && diff --git a/tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml index 4663e19..2428aff 100644 --- a/tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml @@ -168,6 +168,7 @@ <flag name='debug-threads'/> <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> + <flag name='name-guest'/> <version>2001001</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml index a8df7e1..68ea0de 100644 --- a/tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml @@ -181,6 +181,7 @@ <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> <version>2004000</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml index 2160173..73f0147 100644 --- a/tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml @@ -182,6 +182,7 @@ <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> <version>2004000</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml index f4e6db1..362ec1c 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml @@ -158,6 +158,7 @@ <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> <version>2005094</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml b/tests/qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml index 96a02a5..1d5d670 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml @@ -152,6 +152,7 @@ <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> <version>2005094</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml index 9024d63..5970d19 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml @@ -187,6 +187,7 @@ <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> <version>2005050</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml index f4d60d1..2138049 100644 --- a/tests/qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml @@ -158,6 +158,7 @@ <flag name='device-tray-moved-event'/> <flag name='nec-usb-xhci-ports'/> <flag name='virtio-scsi-pci.iothread'/> + <flag name='name-guest'/> <version>2005094</version> <kvmVersion>0</kvmVersion> <package></package> diff --git a/tests/qemucaps2xmldata/all_1.6.0-1.caps b/tests/qemucaps2xmldata/all_1.6.0-1.caps index 1484c79..d39d0be 100644 --- a/tests/qemucaps2xmldata/all_1.6.0-1.caps +++ b/tests/qemucaps2xmldata/all_1.6.0-1.caps @@ -125,4 +125,5 @@ <flag name='pvpanic'/> <flag name='reboot-timeout'/> <flag name='enable-fips'/> + <flag name='name-guest'/> </qemuCaps> diff --git a/tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps b/tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps index 8bd8a18..5a0372c 100644 --- a/tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps +++ b/tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps @@ -124,4 +124,5 @@ <flag name='pvpanic'/> <flag name='reboot-timeout'/> <flag name='enable-fips'/> + <flag name='name-guest'/> </qemuCaps> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args index b50b8c4..b59706c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.args @@ -5,16 +5,16 @@ USER=test \ LOGNAME=test \ QEMU_AUDIO_DRV=none \ /usr/bin/qemu \ --name foo,,bar,debug-threads=on \ +-name guest=foo=1,,bar=2,debug-threads=on \ -S \ --object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo,,\ -bar/master-key.aes \ +-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo=1,,\ +bar=2/master-key.aes \ -M pc \ -m 214 \ -smp 1 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ -nodefaults \ --chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo,,bar/monitor.sock,\ +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-foo=1,,bar=2/monitor.sock,\ server,nowait \ -mon chardev=charmonitor,id=monitor,mode=readline \ -no-acpi \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml index e263553..5e8c747 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml @@ -1,5 +1,5 @@ <domain type='qemu'> - <name>foo,bar</name> + <name>foo=1,bar=2</name> <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> <memory unit='KiB'>219100</memory> <currentMemory unit='KiB'>219100</currentMemory> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5d15dfd..68f0a84 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1894,7 +1894,8 @@ mymain(void) NONE); DO_TEST("name-escape", QEMU_CAPS_NAME_DEBUG_THREADS, - QEMU_CAPS_OBJECT_SECRET, QEMU_CAPS_CHARDEV, QEMU_CAPS_VNC); + QEMU_CAPS_OBJECT_SECRET, QEMU_CAPS_CHARDEV, QEMU_CAPS_VNC, + QEMU_CAPS_NAME_GUEST); DO_TEST("debug-threads", QEMU_CAPS_NAME_DEBUG_THREADS); DO_TEST("master-key", QEMU_CAPS_OBJECT_SECRET); -- 2.7.4

On 05/08/2016 02:43 PM, Cole Robinson wrote:
This series adds qemu cli comma escaping to several places that are dependent on the VM name, to enable names with embedded commas.
Patch 6 makes use of qemu -name guest=X value to allow names with '=' in them.
https://bugzilla.redhat.com/show_bug.cgi?id=639926 https://bugzilla.redhat.com/show_bug.cgi?id=1276485
Note: There's likely other places that are VM name dependent that need comma escaping too, but this hits the mandatory ones. I've listed some more on the BiteSizedTasks page:
http://wiki.libvirt.org/page/BiteSizedTasks#qemu:_Use_comma_escaping_for_mor...
v3: Patch 1 and patch 4 are new
Cole Robinson (6): qemu: command: Add qemuBufferEscapeComma qemu: command: escape commas in VM name qemu: command: escape commas in secret master path qemu: command: escape commas in VNC socket path qemu: command: escape commas in chardev socket path qemu: command: Use -name guest= if available
src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 50 ++++++++++++++++------ tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml | 1 + tests/qemucaps2xmldata/all_1.6.0-1.caps | 1 + tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps | 1 + .../qemuxml2argvdata/qemuxml2argv-name-escape.args | 25 +++++++++++ .../qemuxml2argvdata/qemuxml2argv-name-escape.xml | 19 ++++++++ tests/qemuxml2argvtest.c | 3 ++ 15 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml
I think you know you'll have "adjustments" with patch 6 based on recent upstream changes to those caps* files... But, as odd as I find the need for comma's and equal signs in the guest name and seeing as no other agita over this has been brought up... ACK series John

On 05/16/2016 10:07 AM, John Ferlan wrote:
On 05/08/2016 02:43 PM, Cole Robinson wrote:
This series adds qemu cli comma escaping to several places that are dependent on the VM name, to enable names with embedded commas.
Patch 6 makes use of qemu -name guest=X value to allow names with '=' in them.
https://bugzilla.redhat.com/show_bug.cgi?id=639926 https://bugzilla.redhat.com/show_bug.cgi?id=1276485
Note: There's likely other places that are VM name dependent that need comma escaping too, but this hits the mandatory ones. I've listed some more on the BiteSizedTasks page:
http://wiki.libvirt.org/page/BiteSizedTasks#qemu:_Use_comma_escaping_for_mor...
v3: Patch 1 and patch 4 are new
Cole Robinson (6): qemu: command: Add qemuBufferEscapeComma qemu: command: escape commas in VM name qemu: command: escape commas in secret master path qemu: command: escape commas in VNC socket path qemu: command: escape commas in chardev socket path qemu: command: Use -name guest= if available
src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 50 ++++++++++++++++------ tests/qemucapabilitiesdata/caps_2.1.1-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.4.0-1.x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_2.5.0-1.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-1.aarch64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-1.ppc64le.xml | 1 + tests/qemucapabilitiesdata/caps_2.6.0-1.x86_64.xml | 1 + .../qemucapabilitiesdata/caps_2.6.0-2.aarch64.xml | 1 + tests/qemucaps2xmldata/all_1.6.0-1.caps | 1 + tests/qemucaps2xmldata/nodisksnapshot_1.6.0-1.caps | 1 + .../qemuxml2argvdata/qemuxml2argv-name-escape.args | 25 +++++++++++ .../qemuxml2argvdata/qemuxml2argv-name-escape.xml | 19 ++++++++ tests/qemuxml2argvtest.c | 3 ++ 15 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-name-escape.xml
I think you know you'll have "adjustments" with patch 6 based on recent upstream changes to those caps* files... But, as odd as I find the need for comma's and equal signs in the guest name and seeing as no other agita over this has been brought up...
ACK series
Thanks, pushed now - Cole
participants (2)
-
Cole Robinson
-
John Ferlan