From e6f05099e8de3c89201aa92c5d6f0286b9299522 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Fri, 15 Oct 2010 17:50:03 +0000 Subject: Fix a potential segfault due to weak symbols on pthreads In xmlInitParser, both __xmlGlobalInitMutexLock and xmlInitGlobals are called before xmlInitThreads, and both use pthread symbols. __xmlGlobalInitMutexLock does so directly, without checking if the symbol exists, and xmlInitGlobals calls xmlNewMutex, which correctly depends on libxml_is_threaded... except libxml_is_threaded is still -1 by then... And again, when releasing the global mutex in __xmlGlobalInitMutexUnlock, the pthread function is called directly. The patch changes the initialization order and make sure the functions are available before calling them --- diff --git a/parser.c b/parser.c index 85e7599..1db706b 100644 --- a/parser.c +++ b/parser.c @@ -14004,8 +14004,8 @@ xmlInitParser(void) { __xmlGlobalInitMutexLock(); if (xmlParserInitialized == 0) { #endif - xmlInitGlobals(); xmlInitThreads(); + xmlInitGlobals(); if ((xmlGenericError == xmlGenericErrorDefaultFunc) || (xmlGenericError == NULL)) initGenericErrorDefaultFunc(NULL); diff --git a/threads.c b/threads.c index 98fd2c2..1eeac0e 100644 --- a/threads.c +++ b/threads.c @@ -439,7 +439,8 @@ __xmlGlobalInitMutexLock(void) /* Make sure the global init lock is initialized and then lock it. */ #ifdef HAVE_PTHREAD_H /* The mutex is statically initialized, so we just lock it. */ - pthread_mutex_lock(&global_init_lock); + if (pthread_mutex_lock) + pthread_mutex_lock(&global_init_lock); #elif defined HAVE_WIN32_THREADS LPCRITICAL_SECTION cs; @@ -508,7 +509,8 @@ void __xmlGlobalInitMutexUnlock(void) { #ifdef HAVE_PTHREAD_H - pthread_mutex_unlock(&global_init_lock); + if (pthread_mutex_unlock) + pthread_mutex_unlock(&global_init_lock); #elif defined HAVE_WIN32_THREADS if (global_init_lock != NULL) { LeaveCriticalSection(global_init_lock); -- cgit v0.8.3.1