Hi, I just had a chance to go through my mail backlog and found Ferenc fixed another crash in libvirtd. An updated debdiff is attached. Cheers, -- Guido
diff --git a/debian/changelog b/debian/changelog index 5ead189..27adc06 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,23 @@ +libvirt (0.9.12-11+deb7u3) wheezy-proposed-updates; urgency=low + + * [9c12e5a] Fix race condition when destroying guests. + Closes: #717893 + Thanks to Ferenc Wágner for sorting this out. + + -- Guido Günther <a...@sigxcpu.org> Wed, 21 Aug 2013 19:30:54 +0200 + +libvirt (0.9.12-11+deb7u2) wheezy-proposed-updates; urgency=low + + [ Guido Günther ] + * [5bc00df] Make sure qemu.conf isn't world readable by default + since the user might add passwords to it. (Closes: #710537) + + [ Ferenc Wagner ] + * [ce7ef48] Fix libvirtd crash when destroying a domain with attached console + (Closes: #710517) + + -- Guido Günther <a...@sigxcpu.org> Tue, 20 Aug 2013 10:37:16 +0200 + libvirt (0.9.12-11+deb7u1) wheezy-proposed-updates; urgency=low [ Guido Günther ] diff --git a/debian/libvirt-bin.postinst b/debian/libvirt-bin.postinst index 53119a2..510bee7 100644 --- a/debian/libvirt-bin.postinst +++ b/debian/libvirt-bin.postinst @@ -61,6 +61,8 @@ add_statoverrides() SANLOCK_DIR="/var/lib/libvirt/sanlock" + QEMU_CONF="/etc/libvirt/qemu.conf" + for dir in ${ROOT_DIRS}; do if ! dpkg-statoverride --list "${dir}" >/dev/null 2>&1; then chown root:root "${dir}" @@ -79,6 +81,11 @@ add_statoverrides() chown root:root "${SANLOCK_DIR}" chmod 0700 "${SANLOCK_DIR}" fi + + if ! dpkg-statoverride --list "${QEMU_CONF}" >/dev/null 2>&1; then + chown root:root "${QEMU_CONF}" + chmod 0600 "${QEMU_CONF}" + fi } diff --git a/debian/patches/series b/debian/patches/series index 5e1cbe7..60bcbee 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -20,3 +20,5 @@ rpc-Fix-crash-on-error-paths-of-message-dispatching.patch qemu-Add-support-for-no-user-config.patch debian/Allow-xen-toolstack-to-find-it-s-binaries.patch fix-leak-virStorageBackendLogicalMakeVol.patch +upstream/Fix-libvirtd-crash-when-destroying-a-domain-with-att.patch +upstream/Fix-race-condition-when-destroying-guests.patch diff --git a/debian/patches/upstream/Fix-libvirtd-crash-when-destroying-a-domain-with-att.patch b/debian/patches/upstream/Fix-libvirtd-crash-when-destroying-a-domain-with-att.patch new file mode 100644 index 0000000..62899fa --- /dev/null +++ b/debian/patches/upstream/Fix-libvirtd-crash-when-destroying-a-domain-with-att.patch @@ -0,0 +1,72 @@ +From: Peter Krempa <pkre...@redhat.com> +Date: Sat, 8 Jun 2013 15:20:45 +0200 +Subject: Fix libvirtd crash when destroying a domain with attached console + +Origin: upstream +Bug: https://bugzilla.redhat.com/show_bug.cgi?id=969497 +Applied-Upstream: ba226d334acbc49f6751b430e0c4e00f69eef6bf and 45edefc7a7bcbec988f54331ff37fc32e4bc2718 +Last-Update: 2013-06-07 + +This is two upstream commits squashed: + +commit ba226d334acbc49f6751b430e0c4e00f69eef6bf +Author: Peter Krempa <pkre...@redhat.com> +Date: Fri Jul 27 14:50:54 2012 +0200 + + conf: Remove callback from stream when freeing entries in console hash + + When a domain has a active console connection and is destroyed the + callback is called on private data that no longer exist causing a + segfault. + +commit 45edefc7a7bcbec988f54331ff37fc32e4bc2718 +Author: Peter Krempa <pkre...@redhat.com> +Date: Fri Aug 3 11:20:29 2012 +0200 + + conf: Remove console stream callback only when freeing console helper + + Commit ba226d334acbc49f6751b430e0c4e00f69eef6bf tried to fix crash of + the daemon when a domain with an open console was destroyed. The fix was + wrong as it tried to remove the callback also when the stream was + aborted, where at that point the fd stream driver was already freed and + removed. + + This patch clears the callbacks with a helper right before the hash is + freed, so that it doesn't interfere with other codepaths where the + stream object is freed. + +--- + src/conf/virconsole.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/src/conf/virconsole.c b/src/conf/virconsole.c +index 443d80d..01f1c84 100644 +--- a/src/conf/virconsole.c ++++ b/src/conf/virconsole.c +@@ -290,6 +290,18 @@ error: + } + + /** ++ * Helper to clear stream callbacks when freeing the hash ++ */ ++static void virConsoleFreeClearCallbacks(void *payload, ++ const void *name ATTRIBUTE_UNUSED, ++ void *data ATTRIBUTE_UNUSED) ++{ ++ virStreamPtr st = payload; ++ ++ virFDStreamSetInternalCloseCb(st, NULL, NULL, NULL); ++} ++ ++/** + * Free structures for handling open console streams. + * + * @cons Pointer to the private structure. +@@ -300,6 +312,7 @@ void virConsoleFree(virConsolesPtr cons) + return; + + virMutexLock(&cons->lock); ++ virHashForEach(cons->hash, virConsoleFreeClearCallbacks, NULL); + virHashFree(cons->hash); + virMutexUnlock(&cons->lock); + virMutexDestroy(&cons->lock); diff --git a/debian/patches/upstream/Fix-race-condition-when-destroying-guests.patch b/debian/patches/upstream/Fix-race-condition-when-destroying-guests.patch new file mode 100644 index 0000000..121a511 --- /dev/null +++ b/debian/patches/upstream/Fix-race-condition-when-destroying-guests.patch @@ -0,0 +1,55 @@ +From: =?UTF-8?q?Ferenc=20W=C3=A1gner?= <wf...@niif.hu> +Date: Wed, 21 Aug 2013 18:58:06 +0200 +Subject: Fix race condition when destroying guests + +Backport of 81621f3e6e45e8681cc18ae49404736a0e772a11 and +f1b4021b38f9485c50d386af6f682ecfc8025af5 to fix a race (resulting in a +segfault) when destroying domains. +--- + src/qemu/qemu_driver.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 0053ed1..c0b4707 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -1827,6 +1827,12 @@ qemuDomainDestroyFlags(virDomainPtr dom, + + qemuDomainSetFakeReboot(driver, vm, false); + ++ ++ /* We need to prevent monitor EOF callback from doing our work (and sending ++ * misleading events) while the vm is unlocked inside BeginJob/ProcessKill API ++ */ ++ priv->beingDestroyed = true; ++ + /* Although qemuProcessStop does this already, there may + * be an outstanding job active. We want to make sure we + * can kill the process even if a job is active. Killing +@@ -1834,19 +1840,20 @@ qemuDomainDestroyFlags(virDomainPtr dom, + */ + if (flags & VIR_DOMAIN_DESTROY_GRACEFUL) { + if (qemuProcessKill(driver, vm, 0) < 0) { ++ priv->beingDestroyed = false; + qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("failed to kill qemu process with SIGTERM")); + goto cleanup; + } + } else { +- ignore_value(qemuProcessKill(driver, vm, VIR_QEMU_PROCESS_KILL_FORCE)); ++ if (qemuProcessKill(driver, vm, VIR_QEMU_PROCESS_KILL_FORCE) < 0) { ++ priv->beingDestroyed = false; ++ qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", ++ _("failed to kill qemu process with SIGTERM")); ++ goto cleanup; ++ } + } + +- /* We need to prevent monitor EOF callback from doing our work (and sending +- * misleading events) while the vm is unlocked inside BeginJob API +- */ +- priv->beingDestroyed = true; +- + if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_DESTROY) < 0) + goto cleanup; +