9c6c51
From e093a96f00590a93221fac3db6397ec1d2982fdb Mon Sep 17 00:00:00 2001
9c6c51
Message-Id: <e093a96f00590a93221fac3db6397ec1d2982fdb@dist-git>
9c6c51
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
9c6c51
Date: Fri, 6 Jul 2018 15:47:02 +0100
9c6c51
Subject: [PATCH] qemu: fix UNIX socket chardevs operating in client mode
9c6c51
MIME-Version: 1.0
9c6c51
Content-Type: text/plain; charset=UTF-8
9c6c51
Content-Transfer-Encoding: 8bit
9c6c51
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1598440
9c6c51
9c6c51
When support was adding for passing a pre-opened listener socket to UNIX
9c6c51
chardevs, it accidentally passed the listener socket for client mode
9c6c51
chardevs too with predictable amounts of fail resulting. This affects
9c6c51
libvirt when using QEMU >= 2.12
9c6c51
9c6c51
Expand the unit test coverage to validate that we are only doing FD
9c6c51
passing when operating in server mode.
9c6c51
9c6c51
  https://bugzilla.redhat.com/show_bug.cgi?id=1598440
9c6c51
9c6c51
Tested-by: Richard W.M. Jones <rjones@redhat.com>
9c6c51
Reported-by: Richard W.M. Jones <rjones@redhat.com>
9c6c51
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
9c6c51
(cherry picked from commit 1bc1a7e3205f7ef75ebd8fd1ef7653f8e181e3d2)
9c6c51
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
9c6c51
---
9c6c51
 src/qemu/qemu_command.c                       |  3 +-
9c6c51
 .../qemuxml2argvdata/serial-unix-chardev.args |  2 ++
9c6c51
 .../serial-unix-chardev.x86_64-latest.args    | 36 +++++++++++++++++++
9c6c51
 .../qemuxml2argvdata/serial-unix-chardev.xml  |  4 +++
9c6c51
 tests/qemuxml2argvtest.c                      |  1 +
9c6c51
 5 files changed, 45 insertions(+), 1 deletion(-)
9c6c51
 create mode 100644 tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args
9c6c51
9c6c51
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
9c6c51
index 637e787d25..f38ae668a7 100644
9c6c51
--- a/src/qemu/qemu_command.c
9c6c51
+++ b/src/qemu/qemu_command.c
9c6c51
@@ -5082,7 +5082,8 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager,
9c6c51
         break;
9c6c51
 
9c6c51
     case VIR_DOMAIN_CHR_TYPE_UNIX:
9c6c51
-        if ((flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
9c6c51
+        if (dev->data.nix.listen &&
9c6c51
+            (flags & QEMU_BUILD_CHARDEV_UNIX_FD_PASS) &&
9c6c51
             virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS)) {
9c6c51
             if (qemuSecuritySetSocketLabel(secManager, (virDomainDefPtr)def) < 0)
9c6c51
                 goto cleanup;
9c6c51
diff --git a/tests/qemuxml2argvdata/serial-unix-chardev.args b/tests/qemuxml2argvdata/serial-unix-chardev.args
9c6c51
index 584f4a1dd1..873d3263c6 100644
9c6c51
--- a/tests/qemuxml2argvdata/serial-unix-chardev.args
9c6c51
+++ b/tests/qemuxml2argvdata/serial-unix-chardev.args
9c6c51
@@ -26,4 +26,6 @@ server,nowait \
9c6c51
 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
9c6c51
 -chardev socket,id=charserial0,path=/tmp/serial.sock \
9c6c51
 -device isa-serial,chardev=charserial0,id=serial0 \
9c6c51
+-chardev socket,id=charserial1,path=/tmp/serial-server.sock,server,nowait \
9c6c51
+-device isa-serial,chardev=charserial1,id=serial1 \
9c6c51
 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
9c6c51
diff --git a/tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args b/tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args
9c6c51
new file mode 100644
9c6c51
index 0000000000..ce7a7f80d7
9c6c51
--- /dev/null
9c6c51
+++ b/tests/qemuxml2argvdata/serial-unix-chardev.x86_64-latest.args
9c6c51
@@ -0,0 +1,36 @@
9c6c51
+LC_ALL=C \
9c6c51
+PATH=/bin \
9c6c51
+HOME=/home/test \
9c6c51
+USER=test \
9c6c51
+LOGNAME=test \
9c6c51
+QEMU_AUDIO_DRV=none \
9c6c51
+/usr/bin/qemu-system-i686 \
9c6c51
+-name guest=QEMUGuest1,debug-threads=on \
9c6c51
+-S \
9c6c51
+-object secret,id=masterKey0,format=raw,\
9c6c51
+file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
9c6c51
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
9c6c51
+-m 214 \
9c6c51
+-realtime mlock=off \
9c6c51
+-smp 1,sockets=1,cores=1,threads=1 \
9c6c51
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
9c6c51
+-display none \
9c6c51
+-no-user-config \
9c6c51
+-nodefaults \
9c6c51
+-chardev socket,id=charmonitor,fd=1729,server,nowait \
9c6c51
+-mon chardev=charmonitor,id=monitor,mode=control \
9c6c51
+-rtc base=utc \
9c6c51
+-no-shutdown \
9c6c51
+-no-acpi \
9c6c51
+-boot strict=on \
9c6c51
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
9c6c51
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
9c6c51
+-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
9c6c51
+-chardev socket,id=charserial0,path=/tmp/serial.sock \
9c6c51
+-device isa-serial,chardev=charserial0,id=serial0 \
9c6c51
+-chardev socket,id=charserial1,fd=1729,server,nowait \
9c6c51
+-device isa-serial,chardev=charserial1,id=serial1 \
9c6c51
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
9c6c51
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
9c6c51
+resourcecontrol=deny \
9c6c51
+-msg timestamp=on
9c6c51
diff --git a/tests/qemuxml2argvdata/serial-unix-chardev.xml b/tests/qemuxml2argvdata/serial-unix-chardev.xml
9c6c51
index 04f83779ce..af513d6445 100644
9c6c51
--- a/tests/qemuxml2argvdata/serial-unix-chardev.xml
9c6c51
+++ b/tests/qemuxml2argvdata/serial-unix-chardev.xml
9c6c51
@@ -25,6 +25,10 @@
9c6c51
       <source mode='connect' path='/tmp/serial.sock'/>
9c6c51
       <target port='0'/>
9c6c51
     </serial>
9c6c51
+    <serial type='unix'>
9c6c51
+      <source mode='bind' path='/tmp/serial-server.sock'/>
9c6c51
+      <target port='1'/>
9c6c51
+    </serial>
9c6c51
     <console type='unix'>
9c6c51
       <source mode='connect' path='/tmp/serial.sock'/>
9c6c51
       <target port='0'/>
9c6c51
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
9c6c51
index 2d52f352b0..3be5af03aa 100644
9c6c51
--- a/tests/qemuxml2argvtest.c
9c6c51
+++ b/tests/qemuxml2argvtest.c
9c6c51
@@ -1335,6 +1335,7 @@ mymain(void)
9c6c51
             QEMU_CAPS_CHARDEV_FILE_APPEND);
9c6c51
     DO_TEST("serial-unix-chardev",
9c6c51
             QEMU_CAPS_DEVICE_ISA_SERIAL);
9c6c51
+    DO_TEST_CAPS_LATEST("serial-unix-chardev");
9c6c51
     DO_TEST("serial-tcp-chardev",
9c6c51
             QEMU_CAPS_DEVICE_ISA_SERIAL);
9c6c51
     DO_TEST("serial-udp-chardev",
9c6c51
-- 
9c6c51
2.18.0
9c6c51