diff -ur libXft-2.3.2.orig/src/xftdpy.c libXft-2.3.2/src/xftdpy.c
--- libXft-2.3.2.orig/src/xftdpy.c	2014-06-06 00:05:07.000000000 -0600
+++ libXft-2.3.2/src/xftdpy.c	2017-10-17 08:55:30.227746279 -0600
@@ -22,6 +22,11 @@
 
 #include "xftint.h"
 
+#include <pthread.h>
+static pthread_mutex_t info_mutex = PTHREAD_MUTEX_INITIALIZER;
+static inline void info_lock() { pthread_mutex_lock(&info_mutex); }
+static inline void info_unlock() { pthread_mutex_unlock(&info_mutex); }
+
 _X_HIDDEN XftDisplayInfo	*_XftDisplayInfo;
 
 static int
@@ -48,10 +53,12 @@
     /*
      * Unhook from the global list
      */
+    info_lock();
     for (prev = &_XftDisplayInfo; (info = *prev); prev = &(*prev)->next)
 	if (info->display == dpy)
 	    break;
     *prev = info->next;
+    info_unlock();
 
     free (info);
     return 0;
@@ -66,6 +73,7 @@
     int			i;
     int			event_base, error_base;
 
+    info_lock();
     for (prev = &_XftDisplayInfo; (info = *prev); prev = &(*prev)->next)
     {
 	if (info->display == dpy)
@@ -79,9 +87,12 @@
 		info->next = _XftDisplayInfo;
 		_XftDisplayInfo = info;
 	    }
+	    info_unlock();
 	    return info;
 	}
     }
+    info_unlock();
+
     if (!createIfNecessary)
 	return NULL;
 
@@ -157,8 +168,10 @@
     }
     info->fonts = NULL;
 
+    info_lock();
     info->next = _XftDisplayInfo;
     _XftDisplayInfo = info;
+    info_unlock();
 
     info->glyph_memory = 0;
     info->max_glyph_memory = XftDefaultGetInteger (dpy,
Only in libXft-2.3.2: tags
