]> xenbits.xensource.com Git - libvirt.git/commitdiff
Initialize threading & error layer in LXC controller
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 8 Oct 2013 13:35:01 +0000 (14:35 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 14 Oct 2013 11:16:23 +0000 (12:16 +0100)
In Fedora 20, libvirt_lxc crashes immediately at startup with a
trace

 #0  0x00007f0cddb653ec in free () from /lib64/libc.so.6
 #1  0x00007f0ce0e16f4a in virFree (ptrptr=ptrptr@entry=0x7f0ce1830058) at util/viralloc.c:580
 #2  0x00007f0ce0e2764b in virResetError (err=0x7f0ce1830030) at util/virerror.c:354
 #3  0x00007f0ce0e27a5a in virResetLastError () at util/virerror.c:387
 #4  0x00007f0ce0e28858 in virEventRegisterDefaultImpl () at util/virevent.c:233
 #5  0x00007f0ce0db47c6 in main (argc=11, argv=0x7fff4596c328) at lxc/lxc_controller.c:2352

Normally virInitialize calls virErrorInitialize and
virThreadInitialize, but we don't link to libvirt.so
in libvirt_lxc, and nor did we ever call the error
or thread initializers.

I have absolutely no idea how this has ever worked, let alone
what caused it to stop working in Fedora 20.

In addition not all code paths from virLogSetFromEnv will
ensure virLogInitialize is called correctly, which is another
possible crash scenario.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/lxc/lxc_controller.c
src/util/virlog.c

index 1c6aed62d360924d4d3d3a37e53c6dd24efcc8b5..851a7735152ca1f0b5b62c7fc517d5e1d6c63830 100644 (file)
@@ -2257,7 +2257,9 @@ int main(int argc, char *argv[])
 
     if (setlocale(LC_ALL, "") == NULL ||
         bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
-        textdomain(PACKAGE) == NULL) {
+        textdomain(PACKAGE) == NULL ||
+        virThreadInitialize() < 0 ||
+        virErrorInitialize() < 0) {
         fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
         exit(EXIT_FAILURE);
     }
index cc5032fa37f7d2c555636295630c7976c0e7b6cd..8a688fde0262523b13edc80821b4b2a14fa94629 100644 (file)
@@ -547,6 +547,9 @@ virLogDefineFilter(const char *match,
 
     virCheckFlags(VIR_LOG_STACK_TRACE, -1);
 
+    if (virLogInitialize() < 0)
+        return -1;
+
     if ((match == NULL) || (priority < VIR_LOG_DEBUG) ||
         (priority > VIR_LOG_ERROR))
         return -1;
@@ -662,6 +665,9 @@ virLogDefineOutput(virLogOutputFunc f,
 
     virCheckFlags(0, -1);
 
+    if (virLogInitialize() < 0)
+        return -1;
+
     if (f == NULL)
         return -1;