]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
security: fix deadlock with prefork
authorEric Blake <eblake@redhat.com>
Fri, 19 Jul 2013 15:07:19 +0000 (09:07 -0600)
committerEric Blake <eblake@redhat.com>
Mon, 22 Jul 2013 20:04:22 +0000 (14:04 -0600)
https://bugzilla.redhat.com/show_bug.cgi?id=964358

Attempts to start a domain with both SELinux and DAC security
modules loaded will deadlock; latent problem introduced in commit
fdb3bde and exposed in commit 29fe5d7.  Basically, when recursing
into the security manager for other driver's prefork, we have to
undo the asymmetric lock taken at the manager level.

Reported by Jiri Denemark, with diagnosis help from Dan Berrange.

* src/security/security_stack.c (virSecurityStackPreFork): Undo
extra lock grabbed during recursion.

Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit bfc183c1e377b24cebf5cede4c00f3dc0d1b3486)

src/security/security_stack.c

index 82b79c326c9a87bcf28cc377a83349e4d9cd3efd..087aa81752d06751e88f8a76db0fbadcbcd13d91 100644 (file)
@@ -129,6 +129,11 @@ virSecurityStackPreFork(virSecurityManagerPtr mgr)
             rc = -1;
             break;
         }
+        /* Undo the unbalanced locking left behind after recursion; if
+         * PostFork ever delegates to driver callbacks, we'd instead
+         * need to recurse to an internal method that does not regrab
+         * a lock. */
+        virSecurityManagerPostFork(item->securityManager);
     }
 
     return rc;