[libvirt] [PATCH] qemu: Initialize GnuTLS

Michal Privoznik mprivozn at redhat.com
Wed Aug 17 16:55:46 UTC 2011


When spice_tls is set but listen_tls is not, we don't initialize
GnuTLS library. So any later gnutls call (e.g. during migration,
where we initialize a certificate) will access uninitialized GnuTLS
internal structs and throws an error.

Although, we might now initialize GnuTLS twice, it is safe according
to the documentation:

    This function can be called many times,
    but will only do something the first time.
---
 src/qemu/qemu_driver.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 421a98e..5fe20b6 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -44,6 +44,7 @@
 #include <sys/ioctl.h>
 #include <sys/un.h>
 #include <byteswap.h>
+#include <gnutls/gnutls.h>
 
 
 #include "qemu_driver.h"
@@ -537,6 +538,15 @@ qemudStartup(int privileged) {
     }
     VIR_FREE(driverConf);
 
+    if (qemu_driver->spiceTLS) {
+        /* Initialize GnuTLS. If it was initialized before,
+         * it doesn't hurt. From GnuTLS documentation:
+         * This function can be called many times,
+         * but will only do something the first time.
+         */
+        gnutls_global_init();
+    }
+
     /* We should always at least have the 'nop' manager, so
      * NULLs here are a fatal error
      */
@@ -754,6 +764,9 @@ qemudShutdown(void) {
 
     qemuProcessAutoDestroyShutdown(qemu_driver);
 
+    if (qemu_driver->spiceTLS)
+        gnutls_global_deinit();
+
     VIR_FREE(qemu_driver->configDir);
     VIR_FREE(qemu_driver->autostartDir);
     VIR_FREE(qemu_driver->logDir);
-- 
1.7.3.4




More information about the libvir-list mailing list