Libvirt provides a portable, long term stable C API for managing the virtualization technologies provided by many operating systems. It includes support for QEMU, KVM, Xen, LXC, bhyve, Virtuozzo, VMware vCenter and ESX, VMware Desktop, Hyper-V, VirtualBox and the POWER Hypervisor.
Go to file
Peter Krempa b7c98329cb conf: Fix race between looking up a domain object and freeing it
This patch fixes crash of the daemon that happens due to the following race
condition:

Let's have two threads in the libvirtd daemon's qemu driver:
A - thread executing undefine on the same domain
B - thread executing a API call to get information about a domain

Assume following serialization of operations done by the threads:
1) A has the lock on the domain object and is executing some code prior to
   virDomainObjListRemove()
2) B takes the lock on the domain object list, looks up the domain object
pointer and blocks in the attempt to lock the domain object as A is holding the
lock
3) A reaches virDomainObjListRemove() and unlocks the lock on the domain object
4) A blocks on the attempt to get the domain list lock
5) B is able to lock the domain object now and unlocks the domain list
6) A is now able to lock the domain list, and sheds the last reference on the
domain object, this triggers the freeing function.
6) B starts executing the code on the pointer that is being freed
7) The libvirtd daemon crashes while attempting to access invalid pointer in
thread B.

This patch fixes the race by acquiring a reference on the domain object before
unlocking it in virDomainObjListRemove() and re-locks the object prior to
removing and freeing it. This ensures that no thread holds a lock on the domain
object at the time it is removed from the list, and that doing a list lookup
will never find a domain that is about to vanish.

This is a minimal fix of the problem, but a better solution will be to switch to
full reference counting for domain objects.
2013-04-10 09:32:03 +02:00
.gnulib@076ac82d1d maint: update to latest gnulib 2013-04-09 14:22:09 -06:00
build-aux
daemon Enable full RELRO mode 2013-04-03 16:19:35 +01:00
docs docs: fix typo when using Kerberos principals 2013-04-09 16:46:04 -06:00
examples Re-add DTrace probes on 'dispose' functions 2013-03-14 12:42:21 +00:00
gnulib
include nodedev: Introduce two new flags for listAll API 2013-03-25 20:46:05 +08:00
m4 Disable cast-align warnings in various places 2013-04-08 10:03:21 +01:00
po Release of libvirt-1.0.4 2013-04-01 10:57:04 +08:00
python python: set default value to optional arguments 2013-03-26 12:34:49 +08:00
src conf: Fix race between looking up a domain object and freeing it 2013-04-10 09:32:03 +02:00
tests Implement support for <hostdev caps=net> 2013-04-08 17:40:08 +01:00
tools docs: use MiB/s instead of Mbps for migration speed 2013-04-09 16:45:24 +02:00
.dir-locals.el
.gitignore Add a test suite for keycode mapping functions 2013-04-08 10:03:20 +01:00
.gitmodules
.mailmap
AUTHORS.in Add John Ferlan to the committers list 2013-02-05 10:59:32 -05:00
autobuild.sh Disable static libraries by default 2013-04-03 11:02:27 +01:00
autogen.sh
bootstrap maint: update to latest gnulib 2013-04-09 14:22:09 -06:00
bootstrap.conf build: more mingw fixes 2013-02-15 15:45:52 -07:00
cfg.mk util: portably check for unchanged uid 2013-03-15 10:55:51 -06:00
ChangeLog-old
configure.ac Enable full RELRO mode 2013-04-03 16:19:35 +01:00
COPYING.LIB Update to COPYING.LIB to latest LGPLv2.1 copy 2013-03-15 10:50:32 +01:00
HACKING Turn virSecurityManager into a virObjectLockable 2013-02-11 12:33:41 +00:00
libvirt.pc.in
libvirt.spec.in spec: Require pod2man when running autoreconf 2013-04-08 16:11:16 +02:00
Makefile.am build: Fix AUTHORS generation 2012-12-17 21:17:55 +01:00
Makefile.nonreentrant
mingw-libvirt.spec.in test: Return Libvirt logo as domain screenshot 2013-04-02 14:38:56 +02:00
README Correct typos in the documentation (Atsushi SAKAI) 2008-01-24 10:15:13 +00:00
README-hacking
run.in run: license as LGPL 2013-02-23 14:03:19 -07:00
TODO

         LibVirt : simple API for virtualization

  Libvirt is a C toolkit to interact with the virtualization capabilities
of recent versions of Linux (and other OSes). It is free software
available under the GNU Lesser General Public License. Virtualization of
the Linux Operating System means the ability to run multiple instances of
Operating Systems concurrently on a single hardware system where the basic
resources are driven by a Linux instance. The library aim at providing
long term stable C API initially for the Xen paravirtualization but
should be able to integrate other virtualization mechanisms if needed.

Daniel Veillard <veillard@redhat.com>