summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Hommey <mh@glandium.org>2010-10-15 17:50:03 (GMT)
committerDaniel Veillard <veillard@redhat.com>2010-10-15 17:50:03 (GMT)
commite6f05099e8de3c89201aa92c5d6f0286b9299522 (patch)
tree7610ee1a74defdeb1916e818faf40cf34caf003f
parent3c79510d90965e77fb0cabb385099a564c402d0c (diff)
downloadlibxml2-e6f05099e8de3c89201aa92c5d6f0286b9299522.tar.gz
libxml2-e6f05099e8de3c89201aa92c5d6f0286b9299522.tar.xz
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
-rw-r--r--parser.c2
-rw-r--r--threads.c6
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);