Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package libvirt This fixes several CVEs as well as crashes: CVEs: * CVE-2014-8131: Fix possible deadlock and segfault in qemuConnectGetAllDomainStats() (Closes: #773858) * CVE-2014-8135: storage: fix crash caused by no check return before set close (Closes: #773855) * CVE-2014-8136: qemu: migration: Unlock vm on failed ACL check in protocol v2 APIs (Closes: #773856) Crashes: * qemu: Fix crash in tunnelled migration (Closes: #773503) * lxc: Fix crash when using interface type 'direct' (Closes: #769600) Doc update: * Document surprises on CPU microcode updates (Closes: #773706) Fix unusable drivers/features * vbox: fix a bug in _machineStateInactive (Closes: #770202) * Install lock drivers (Closes: #773706) * qemu: bulk stats: Fix logic in monitor handling I'm not happy with that amount of changes late in the release each individual change is rather small though. Cheers, -- Guido unblock libvirt/1.2.9-7 -- System Information: Debian Release: 8.0 APT prefers testing APT policy: (990, 'testing'), (500, 'testing-updates'), (500, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 3.16.0-rc6 (SMP w/4 CPU cores) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system)
diff --git a/debian/README.Debian b/debian/README.Debian index ffa7917..0fa9358 100644 --- a/debian/README.Debian +++ b/debian/README.Debian @@ -84,4 +84,32 @@ for a complete explanation: <http://bugs.debian.org/453627> <http://bugs.debian.org/614291> - -- Guido Günther <a...@sigxcpu.org> Sun, 28 Sep 2014 09:50:41 +0200 +Libvirt CPU models and microcode updates +======================================== +CPU microcode updates (e.g. via the intel-microcode package) might change the +available CPU flags. One example is version 3.20140913.1 of the intel-microcode +removing TSX-NI which results in the kernel no longer reporting the *hle* flag. + +In this case if you hard coded the CPU model in your virtual machine +configuration via: + + <cpu mode='custom' match='exact'> + <model fallback='forbid'>Haswell</model> + <vendor>Intel</vendor> + ... + </cpu> + +and update the CPU microcode the VM might fail to start with errors like + + error: Failed to start domain foo + error: unsupported configuration: guest and host CPU are not compatible: Host CPU does not provide required features: hle + +since libvirt doesn't differentiate between microcode versions. It is therefore +recommended to copy over the needed CPU flags instead of hard coding the CPU +model. See + + <https://www.redhat.com/archives/libvir-list/2014-December/msg00950.html> + +for further details. + + -- Guido Günther <a...@sigxcpu.org> Wen, 24 Dec 2014 09:55:41 +0200 diff --git a/debian/changelog b/debian/changelog index b4f25d7..90ea4aa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,24 @@ +libvirt (1.2.9-7) unstable; urgency=medium + + * [d7df883] CVE-2014-8131: Fix possible deadlock and segfault in + qemuConnectGetAllDomainStats() + (Closes: #773858) + * [d0085e0] qemu: bulk stats: Fix logic in monitor handling + * [b5e081c] CVE-2014-8135: storage: fix crash caused by no check return + before set close + (Closes: #773855) + * [a5452de] CVE-2014-8136: qemu: migration: Unlock vm on failed ACL check in + protocol v2 APIs + (Closes: #773856) + * [5aaafc9] qemu: Fix crash in tunnelled migration (Closes: #773503) + * [87b3713] lxc: Fix crash when using interface type 'direct' + Thanks to Bastian Blank for the patch (Closes: #769600) + * [17807c0] Document surprises on CPU microcode updates (Closes: #773706) + * [66a3ca6] Install lock drivers (Closes: #773706) + * [f6ffda7] vbox: fix a bug in _machineStateInactive (Closes: #770202) + + -- Guido Günther <a...@sigxcpu.org> Wed, 24 Dec 2014 10:33:31 +0100 + libvirt (1.2.9-6) unstable; urgency=medium * [9779548] Add a python build-dependency for the docs build diff --git a/debian/libvirt-daemon.install b/debian/libvirt-daemon.install index 74ba67f..7852973 100644 --- a/debian/libvirt-daemon.install +++ b/debian/libvirt-daemon.install @@ -1,5 +1,6 @@ usr/sbin/* usr/lib/libvirt/libvirt* +usr/lib/libvirt/lock-driver/lockd.so usr/lib/libvirt/connection-driver usr/share/augeas/* usr/share/libvirt/* diff --git a/debian/patches/lxc-Don-t-crash-on-NULL-ifname_guest_actual.patch b/debian/patches/lxc-Don-t-crash-on-NULL-ifname_guest_actual.patch new file mode 100644 index 0000000..9222bf8 --- /dev/null +++ b/debian/patches/lxc-Don-t-crash-on-NULL-ifname_guest_actual.patch @@ -0,0 +1,21 @@ +From: =?utf-8?q?Guido_G=C3=BCnther?= <a...@sigxcpu.org> +Date: Fri, 19 Dec 2014 10:11:42 +0100 +Subject: lxc: Don't crash on NULL ifname_guest_actual + +--- + src/lxc/lxc_container.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c +index 2af2674..0ebcb11 100644 +--- a/src/lxc/lxc_container.c ++++ b/src/lxc/lxc_container.c +@@ -473,7 +473,7 @@ lxcContainerGetNetDef(virDomainDefPtr vmDef, const char *devName) + + for (i = 0; i < vmDef->nnets; i++) { + netDef = vmDef->nets[i]; +- if (STREQ(netDef->ifname_guest_actual, devName)) ++ if (netDef->ifname_guest_actual && STREQ(netDef->ifname_guest_actual, devName)) + return netDef; + } + diff --git a/debian/patches/lxc-Move-setting-ifname_guest_actual-to-virLXCSetupI.patch b/debian/patches/lxc-Move-setting-ifname_guest_actual-to-virLXCSetupI.patch new file mode 100644 index 0000000..772a1cc --- /dev/null +++ b/debian/patches/lxc-Move-setting-ifname_guest_actual-to-virLXCSetupI.patch @@ -0,0 +1,32 @@ +From: =?utf-8?q?Guido_G=C3=BCnther?= <a...@sigxcpu.org> +Date: Fri, 19 Dec 2014 10:08:38 +0100 +Subject: lxc: Move setting ifname_guest_actual to virLXCSetupInterfaces + +so it applies to interfaces of type 'direct' too. +--- + src/lxc/lxc_process.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c +index ed30c37..d15c215 100644 +--- a/src/lxc/lxc_process.c ++++ b/src/lxc/lxc_process.c +@@ -259,8 +259,6 @@ char *virLXCProcessSetupInterfaceBridged(virConnectPtr conn, + + if (virNetDevSetMAC(containerVeth, &net->mac) < 0) + goto cleanup; +- if (VIR_STRDUP(net->ifname_guest_actual, containerVeth) < 0) +- goto cleanup; + + if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) { + if (virNetDevOpenvswitchAddPort(brname, parentVeth, &net->mac, +@@ -452,6 +450,9 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn, + + (*veths)[(*nveths)-1] = veth; + ++ if (VIR_STRDUP(def->nets[i]->ifname_guest_actual, veth) < 0) ++ goto cleanup; ++ + /* Make sure all net definitions will have a name in the container */ + if (!def->nets[i]->ifname_guest) { + if (virAsprintf(&def->nets[i]->ifname_guest, "eth%zu", niface) < 0) diff --git a/debian/patches/qemu-bulk-stats-Fix-logic-in-monitor-handling.patch b/debian/patches/qemu-bulk-stats-Fix-logic-in-monitor-handling.patch new file mode 100644 index 0000000..d9400bd --- /dev/null +++ b/debian/patches/qemu-bulk-stats-Fix-logic-in-monitor-handling.patch @@ -0,0 +1,36 @@ +From: Francesco Romani <from...@redhat.com> +Date: Thu, 11 Dec 2014 08:44:09 +0100 +Subject: qemu: bulk stats: Fix logic in monitor handling + +A logic bug in qemuConnectGetAllDomainStats makes the code mark the +monitor as available when qemuDomainObjBeginJob fails, instead of when +it succeeds, as the correct flow requires. + +This patch fixes the check and updates the code documentation +accordingly. + +Broken by commit 57023c0a3af4af1c547189c1f6712ed5edeb0c0b. + +Signed-off-by: Francesco Romani <from...@redhat.com> +(cherry picked from commit cb104ef734dfea12cb8826dba7e2c98912c4b7e1) +Signed-off-by: Martin Kletzander <mklet...@redhat.com> +--- + src/qemu/qemu_driver.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 14a1ae9..048ded9 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -18153,9 +18153,9 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, + } + + if (HAVE_JOB(privflags) && +- qemuDomainObjBeginJob(driver, dom, QEMU_JOB_QUERY) < 0) +- /* As it was never requested. Gather as much as possible anyway. */ ++ qemuDomainObjBeginJob(driver, dom, QEMU_JOB_QUERY) == 0) + domflags |= QEMU_DOMAIN_STATS_HAVE_JOB; ++ /* else: without a job it's still possible to gather some data */ + + if (qemuDomainGetStats(conn, dom, stats, &tmp, domflags) < 0) + goto endjob; diff --git a/debian/patches/security/CVE-2014-8131-Fix-possible-deadlock-and-segfault-in-.patch b/debian/patches/security/CVE-2014-8131-Fix-possible-deadlock-and-segfault-in-.patch new file mode 100644 index 0000000..9ff9874 --- /dev/null +++ b/debian/patches/security/CVE-2014-8131-Fix-possible-deadlock-and-segfault-in-.patch @@ -0,0 +1,73 @@ +From: Martin Kletzander <mklet...@redhat.com> +Date: Thu, 27 Nov 2014 15:47:52 +0100 +Subject: CVE-2014-8131: Fix possible deadlock and segfault in + qemuConnectGetAllDomainStats() + +When user doesn't have read access on one of the domains he requested, +the for loop could exit abruptly or continue and override pointer which +pointed to locked object. + +This patch fixed two issues at once. One is that domflags might have +had QEMU_DOMAIN_STATS_HAVE_JOB even when there was no job started (this +is fixed by doing domflags |= QEMU_DOMAIN_STATS_HAVE_JOB only when the +job was acquired and cleaning domflags on every start of the loop. +Second one is that the domain is kept locked when +virConnectGetAllDomainStatsCheckACL() fails and continues the loop when +it didn't end. Adding a simple virObjectUnlock() and clearing the +pointer ought to do. + +Signed-off-by: Martin Kletzander <mklet...@redhat.com> +(cherry picked from commit 57023c0a3af4af1c547189c1f6712ed5edeb0c0b) +Signed-off-by: Martin Kletzander <mklet...@redhat.com> +--- + src/qemu/qemu_driver.c | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index e873d45..14a1ae9 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -18139,20 +18139,23 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, + privflags |= QEMU_DOMAIN_STATS_HAVE_JOB; + + for (i = 0; i < ndoms; i++) { +- domflags = privflags; + virDomainStatsRecordPtr tmp = NULL; ++ domflags = 0; + + if (!(dom = qemuDomObjFromDomain(doms[i]))) + continue; + + if (doms != domlist && +- !virConnectGetAllDomainStatsCheckACL(conn, dom->def)) ++ !virConnectGetAllDomainStatsCheckACL(conn, dom->def)) { ++ virObjectUnlock(dom); ++ dom = NULL; + continue; ++ } + +- if (HAVE_JOB(domflags) && ++ if (HAVE_JOB(privflags) && + qemuDomainObjBeginJob(driver, dom, QEMU_JOB_QUERY) < 0) + /* As it was never requested. Gather as much as possible anyway. */ +- domflags &= ~QEMU_DOMAIN_STATS_HAVE_JOB; ++ domflags |= QEMU_DOMAIN_STATS_HAVE_JOB; + + if (qemuDomainGetStats(conn, dom, stats, &tmp, domflags) < 0) + goto endjob; +@@ -18160,9 +18163,12 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, + if (tmp) + tmpstats[nstats++] = tmp; + +- if (HAVE_JOB(domflags) && !qemuDomainObjEndJob(driver, dom)) { +- dom = NULL; +- continue; ++ if (HAVE_JOB(domflags)) { ++ domflags = 0; ++ if (!qemuDomainObjEndJob(driver, dom)) { ++ dom = NULL; ++ continue; ++ } + } + + virObjectUnlock(dom); diff --git a/debian/patches/security/CVE-2014-8135-storage-fix-crash-caused-by-no-check-r.patch b/debian/patches/security/CVE-2014-8135-storage-fix-crash-caused-by-no-check-r.patch new file mode 100644 index 0000000..70cf119 --- /dev/null +++ b/debian/patches/security/CVE-2014-8135-storage-fix-crash-caused-by-no-check-r.patch @@ -0,0 +1,44 @@ +From: Luyao Huang <lhu...@redhat.com> +Date: Wed, 3 Dec 2014 23:01:32 +0800 +Subject: CVE-2014-8135: storage: fix crash caused by no check return before + set close + +https://bugzilla.redhat.com/show_bug.cgi?id=1087104#c5 + +When trying to use an invalid offset to virStorageVolUpload(), libvirt +fails in virFDStreamOpenFileInternal(), although it seems libvirt does +not check the return in storageVolUpload(), and calls +virFDStreamSetInternalCloseCb() right after. But stream doesn't have a +privateData (is NULL) yet, and the daemon crashes then. + +0 0x00007f09429a9c10 in pthread_mutex_lock () from /lib64/libpthread.so.0 +1 0x00007f094514dbf5 in virMutexLock (m=<optimized out>) at util/virthread.c:88 +2 0x00007f09451cb211 in virFDStreamSetInternalCloseCb at fdstream.c:795 +3 0x00007f092ff2c9eb in storageVolUpload at storage/storage_driver.c:2098 +4 0x00007f09451f46e0 in virStorageVolUpload at libvirt.c:14000 +5 0x00007f0945c78fa1 in remoteDispatchStorageVolUpload at remote_dispatch.h:14339 +6 remoteDispatchStorageVolUploadHelper at remote_dispatch.h:14309 +7 0x00007f094524a192 in virNetServerProgramDispatchCall at rpc/virnetserverprogram.c:437 + +Signed-off-by: Luyao Huang <lhu...@redhat.com> +(cherry picked from commit 87b9437f8951f9d24f9a85c6bbfff0e54df8c984) +--- + src/storage/storage_driver.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c +index 7c518bf..7d4ae50 100644 +--- a/src/storage/storage_driver.c ++++ b/src/storage/storage_driver.c +@@ -2088,8 +2088,9 @@ storageVolUpload(virStorageVolPtr obj, + goto cleanup; + } + +- ret = backend->uploadVol(obj->conn, pool, vol, stream, +- offset, length, flags); ++ if ((ret = backend->uploadVol(obj->conn, pool, vol, stream, ++ offset, length, flags)) < 0) ++ goto cleanup; + + /* Add cleanup callback - call after uploadVol since the stream + * is then fully set up diff --git a/debian/patches/security/CVE-2014-8136-qemu-migration-Unlock-vm-on-failed-ACL.patch b/debian/patches/security/CVE-2014-8136-qemu-migration-Unlock-vm-on-failed-ACL.patch new file mode 100644 index 0000000..6884e25 --- /dev/null +++ b/debian/patches/security/CVE-2014-8136-qemu-migration-Unlock-vm-on-failed-ACL.patch @@ -0,0 +1,43 @@ +From: Peter Krempa <pkre...@redhat.com> +Date: Mon, 8 Dec 2014 19:25:21 +0100 +Subject: CVE-2014-8136: qemu: migration: Unlock vm on failed ACL check in + protocol v2 APIs + +Avoid leaving the domain locked on a failed ACL check in +qemuDomainMigratePerform() and qemuDomainMigrateFinish2(). + +Introduced in commit abf75aea247e (Add ACL checks into the QEMU driver). + +(cherry picked from commit 2bdcd29c713dfedd813c89f56ae98f6f3898313d) +--- + src/qemu/qemu_driver.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 048ded9..0c9b269 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -11008,8 +11008,10 @@ qemuDomainMigratePerform(virDomainPtr dom, + if (!(vm = qemuDomObjFromDomain(dom))) + goto cleanup; + +- if (virDomainMigratePerformEnsureACL(dom->conn, vm->def) < 0) ++ if (virDomainMigratePerformEnsureACL(dom->conn, vm->def) < 0) { ++ virObjectUnlock(vm); + goto cleanup; ++ } + + if (flags & VIR_MIGRATE_PEER2PEER) { + dconnuri = uri; +@@ -11056,8 +11058,10 @@ qemuDomainMigrateFinish2(virConnectPtr dconn, + goto cleanup; + } + +- if (virDomainMigrateFinish2EnsureACL(dconn, vm->def) < 0) ++ if (virDomainMigrateFinish2EnsureACL(dconn, vm->def) < 0) { ++ virObjectUnlock(vm); + goto cleanup; ++ } + + /* Do not use cookies in v2 protocol, since the cookie + * length was not sufficiently large, causing failures diff --git a/debian/patches/series b/debian/patches/series index cfa566c..3cb2c9f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -16,3 +16,11 @@ debian/Debianize-virtlockd.patch qemu-use-systemd-s-TerminateMachine-to-kill-all-proc.patch security/CVE-2014-7823-dumpxml-security-hole-with-migratable-.patch util-Prepare-URI-formatting-for-libxml2-2.9.2.patch +security/CVE-2014-8131-Fix-possible-deadlock-and-segfault-in-.patch +qemu-bulk-stats-Fix-logic-in-monitor-handling.patch +security/CVE-2014-8135-storage-fix-crash-caused-by-no-check-r.patch +security/CVE-2014-8136-qemu-migration-Unlock-vm-on-failed-ACL.patch +upstream/qemu-Fix-crash-in-tunnelled-migration.patch +lxc-Move-setting-ifname_guest_actual-to-virLXCSetupI.patch +lxc-Don-t-crash-on-NULL-ifname_guest_actual.patch +upstream/vbox-fix-a-bug-in-_machineStateInactive.patch diff --git a/debian/patches/upstream/qemu-Fix-crash-in-tunnelled-migration.patch b/debian/patches/upstream/qemu-Fix-crash-in-tunnelled-migration.patch new file mode 100644 index 0000000..c7e0e13 --- /dev/null +++ b/debian/patches/upstream/qemu-Fix-crash-in-tunnelled-migration.patch @@ -0,0 +1,32 @@ +From: Jiri Denemark <jdene...@redhat.com> +Date: Thu, 20 Nov 2014 13:09:16 +0100 +Subject: qemu: Fix crash in tunnelled migration + +Any attempt to start a tunnelled migration with libvirtd that supports +RDMA migration (specifically commit v1.2.8-226-ged22a47) crashes +libvirtd on the destination host. + +The crash is inevitable because qemuMigrationPrepareAny is always called +with NULL protocol in case of tunnelled migration. + +https://bugzilla.redhat.com/show_bug.cgi?id=1147331 +Signed-off-by: Jiri Denemark <jdene...@redhat.com> + +Closes: #773503 +--- + src/qemu/qemu_migration.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c +index 284cd5a..e18556f 100644 +--- a/src/qemu/qemu_migration.c ++++ b/src/qemu/qemu_migration.c +@@ -2696,7 +2696,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, + QEMU_MIGRATION_COOKIE_NBD))) + goto cleanup; + +- if (STREQ(protocol, "rdma") && !vm->def->mem.hard_limit) { ++ if (STREQ_NULLABLE(protocol, "rdma") && !vm->def->mem.hard_limit) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot start RDMA migration with no memory hard " + "limit set")); diff --git a/debian/patches/upstream/vbox-fix-a-bug-in-_machineStateInactive.patch b/debian/patches/upstream/vbox-fix-a-bug-in-_machineStateInactive.patch new file mode 100644 index 0000000..7f0305c --- /dev/null +++ b/debian/patches/upstream/vbox-fix-a-bug-in-_machineStateInactive.patch @@ -0,0 +1,28 @@ +From: Yohan BELLEGUIC <yohan.belleg...@diateam.net> +Date: Wed, 19 Nov 2014 09:53:15 +0100 +Subject: vbox: fix a bug in _machineStateInactive + +This function returned non-inactive domains instead of active +domains. This broke virConnectNumOfDefinedDomains() and +virConnectListDefinedDomains() functions. + +Closes: #770202 +--- + src/vbox/vbox_tmpl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c +index e5d6d66..c42e186 100644 +--- a/src/vbox/vbox_tmpl.c ++++ b/src/vbox/vbox_tmpl.c +@@ -6081,8 +6081,8 @@ static bool _machineStateOnline(PRUint32 state) + + static bool _machineStateInactive(PRUint32 state) + { +- return ((state > MachineState_FirstOnline) && +- (state < MachineState_LastOnline)); ++ return ((state < MachineState_FirstOnline) || ++ (state > MachineState_LastOnline)); + } + + static bool _machineStateNotStart(PRUint32 state)