File a7a03324-libxl-protect-logger-access.patch of Package libvirt.22291

commit a7a03324d86e111f81687b5315b8f296dde84340
Author: Jim Fehlig <jfehlig@suse.com>
Date:   Thu Nov 18 12:03:20 2021 -0700

    libxl: Protect access to libxlLogger files hash table
    
    The hash table of log file objects in libxlLogger is not protected against
    concurrent access. It is possible for one thread to remove an entry while
    another is updating it. Add a mutex to the libxlLogger object and lock it
    when accessing the files hash table.
    
    Signed-off-by: Jim Fehlig <jfehlig@suse.com>
    Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
    Reviewed-by: Ján Tomko <jtomko@redhat.com>

Index: libvirt-6.0.0/src/libxl/libxl_logger.c
===================================================================
--- libvirt-6.0.0.orig/src/libxl/libxl_logger.c
+++ libvirt-6.0.0/src/libxl/libxl_logger.c
@@ -28,6 +28,7 @@
 #include "util/virfile.h"
 #include "util/virhash.h"
 #include "util/virstring.h"
+#include "util/virthread.h"
 #include "util/virtime.h"
 
 #define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -43,6 +44,7 @@ struct xentoollog_logger_libvirt {
 
     /* map storing the opened fds: "domid" -> FILE* */
     virHashTablePtr files;
+    virMutex tableLock;
     FILE *defaultLogFile;
 };
 
@@ -86,7 +88,9 @@ libvirt_vmessage(xentoollog_logger *logg
         start = start + 9;
         *end = '\0';
 
+        virMutexLock(&lg->tableLock);
         domainLogFile = virHashLookup(lg->files, start);
+        virMutexUnlock(&lg->tableLock);
         if (domainLogFile)
             logFile = domainLogFile;
 
@@ -154,9 +158,14 @@ libxlLoggerNew(const char *logDir, virLo
     }
     logger.logDir = logDir;
 
-    if ((logger.files = virHashCreate(3, libxlLoggerFileFree)) == NULL)
+    if (virMutexInit(&logger.tableLock) < 0)
         return NULL;
 
+    if ((logger.files = virHashCreate(3, libxlLoggerFileFree)) == NULL) {
+        virMutexDestroy(&logger.tableLock);
+        return NULL;
+    }
+
     path = g_strdup_printf("%s/libxl-driver.log", logDir);
 
     if ((logger.defaultLogFile = fopen(path, "a")) == NULL)
@@ -180,6 +189,7 @@ libxlLoggerFree(libxlLoggerPtr logger)
     if (logger->defaultLogFile)
         VIR_FORCE_FCLOSE(logger->defaultLogFile);
     virHashFree(logger->files);
+    virMutexDestroy(&logger->tableLock);
     xtl_logger_destroy(xtl_logger);
 }
 
@@ -202,7 +212,9 @@ libxlLoggerOpenFile(libxlLoggerPtr logge
                  path, virStrerror(errno, ebuf, sizeof(ebuf)));
         goto cleanup;
     }
+    virMutexLock(&logger->tableLock);
     ignore_value(virHashAddEntry(logger->files, domidstr, logFile));
+    virMutexUnlock(&logger->tableLock);
 
     /* domain_config is non NULL only when starting a new domain */
     if (domain_config) {
@@ -221,7 +233,9 @@ libxlLoggerCloseFile(libxlLoggerPtr logg
     char *domidstr = NULL;
     domidstr = g_strdup_printf("%d", id);
 
+    virMutexLock(&logger->tableLock);
     ignore_value(virHashRemoveEntry(logger->files, domidstr));
+    virMutexUnlock(&logger->tableLock);
 
     VIR_FREE(domidstr);
 }
openSUSE Build Service is sponsored by