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