[libxml2] Fix a potential segfault due to weak symbols on pthreads



commit e6f05099e8de3c89201aa92c5d6f0286b9299522
Author: Mike Hommey <mh glandium org>
Date:   Fri Oct 15 19:50:03 2010 +0200

    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

 parser.c  |    2 +-
 threads.c |    6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)
---
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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]