[libvirt] [PATCH] qemu: fix UNIX socket chardevs operating in client mode

Richard W.M. Jones rjones at redhat.com
Fri Jul 6 11:12:51 UTC 2018


On Fri, Jul 06, 2018 at 11:03:00AM +0100, Daniel P. Berrangé wrote:
> When support was adding for passing a pre-opened listener socket to UNIX
> chardevs, it accidentally passed the listener socket for client mode
> chardevs too with predictable amounts of fail resulting.
> 
> Expand the unit test coverage to validate that we are only doing FD
> passing when operating in server mode.
> 
> Reported-by: Richard W.M. Jones <rjones at redhat.com>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>

I suppose you might want to mention in the commit message that the bug
only affects qemu 2.12, and the bug number (1598440).

Anyhow, I tested this patch and it fixes the problem, so:

  Tested-by: Richard W.M. Jones <rjones at redhat.com>

There is a scratch build for Rawhide containing the patch here:

  https://koji.fedoraproject.org/koji/taskinfo?taskID=28050872

Note that the patch requires quite a bit of adjustment to apply and
build against 4.5.0.  I wasn't at all confident that I've done it
right so I didn't push anything to Rawhide.  It'd be good to have this
fix in Rawhide & RHEL 7 asap though.

Rich.

>  src/qemu/qemu_command.c                       |  3 +-
>  .../qemuxml2argvdata/serial-unix-chardev.args |  2 ++
>  .../serial-unix-chardev.x86_64-latest.args    | 36 +++++++++++++++++++
>  .../qemuxml2argvdata/serial-unix-chardev.xml  |  4 +++
>  tests/qemuxml2argvtest.c                      |  1 +
>  5 files changed, 45 insertions(+), 1 deletion(-)
>  create mode 100644 tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 82d8030a33..32eb59b6ab 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5083,7 +5083,8 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
>          break;
>  
>      case VIR_DOMAIN_CHR_TYPE_UNIX:
> -        if ((flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
> +        if (dev->data.nix.listen &&
> +            (flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
>              virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
>              if (qemuSecuritySetSocketLabel(secManager, (virDomainDefPtr)def) < 0)
>                  goto cleanup;
> diff --git a/tests/qemuxml2argvdata/serial-unix-chardev.args b/tests/qemuxml2argvdata/serial-unix-chardev.args
> index 584f4a1dd1..873d3263c6 100644
> --- a/tests/qemuxml2argvdata/serial-unix-chardev.args
> +++ b/tests/qemuxml2argvdata/serial-unix-chardev.args
> @@ -26,4 +26,6 @@ server,nowait \
>  -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
>  -chardev socket,id=charserial0,path=/tmp/serial.sock \
>  -device isa-serial,chardev=charserial0,id=serial0 \
> +-chardev socket,id=charserial1,path=/tmp/serial-server.sock,server,nowait \
> +-device isa-serial,chardev=charserial1,id=serial1 \
>  -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
> diff --git a/tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args
> new file mode 100644
> index 0000000000..ce7a7f80d7
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args
> @@ -0,0 +1,36 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/home/test \
> +USER=test \
> +LOGNAME=test \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i686 \
> +-name guest=QEMUGuest1,debug-threads=on \
> +-S \
> +-object secret,id=masterKey0,format=raw,\
> +file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
> +-machine pc,accel=tcg,usb=off,dump-guest-core=off \
> +-m 214 \
> +-realtime mlock=off \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-display none \
> +-no-user-config \
> +-nodefaults \
> +-chardev socket,id=charmonitor,fd=1729,server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=control \
> +-rtc base=utc \
> +-no-shutdown \
> +-no-acpi \
> +-boot strict=on \
> +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
> +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
> +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
> +-chardev socket,id=charserial0,path=/tmp/serial.sock \
> +-device isa-serial,chardev=charserial0,id=serial0 \
> +-chardev socket,id=charserial1,fd=1729,server,nowait \
> +-device isa-serial,chardev=charserial1,id=serial1 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
> +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
> +resourcecontrol=deny \
> +-msg timestamp=on
> diff --git a/tests/qemuxml2argvdata/serial-unix-chardev.xml b/tests/qemuxml2argvdata/serial-unix-chardev.xml
> index 04f83779ce..af513d6445 100644
> --- a/tests/qemuxml2argvdata/serial-unix-chardev.xml
> +++ b/tests/qemuxml2argvdata/serial-unix-chardev.xml
> @@ -25,6 +25,10 @@
>        <source mode='connect' path='/tmp/serial.sock'/>
>        <target port='0'/>
>      </serial>
> +    <serial type='unix'>
> +      <source mode='bind' path='/tmp/serial-server.sock'/>
> +      <target port='1'/>
> +    </serial>
>      <console type='unix'>
>        <source mode='connect' path='/tmp/serial.sock'/>
>        <target port='0'/>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 2d52f352b0..3be5af03aa 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -1335,6 +1335,7 @@ mymain(void)
>              QEMU_CAPS_CHARDEV_FILE_APPEND);
>      DO_TEST("serial-unix-chardev",
>              QEMU_CAPS_DEVICE_ISA_SERIAL);
> +    DO_TEST_CAPS_LATEST("serial-unix-chardev");
>      DO_TEST("serial-tcp-chardev",
>              QEMU_CAPS_DEVICE_ISA_SERIAL);
>      DO_TEST("serial-udp-chardev",
> -- 
> 2.17.1

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the libvir-list mailing list