forked from rpms/libxslt
126 lines
3.7 KiB
Diff
126 lines
3.7 KiB
Diff
commit 2e8defa7ccef2f76fb1cbfe9e9673d8e4b6cf1d6
|
|
Author: Daniel Veillard <veillard@redhat.com>
|
|
Date: Sun Sep 20 11:51:52 2009 +0200
|
|
|
|
595612 Try to fix some locking problems
|
|
|
|
* libxslt/extensions.c: there were still cases where the normal
|
|
code path could led to trying to mtake again the extension lock
|
|
go over all entry points of the module and clean things up
|
|
|
|
diff --git a/libxslt/extensions.c b/libxslt/extensions.c
|
|
index ebb81f5..6187b7a 100644
|
|
--- a/libxslt/extensions.c
|
|
+++ b/libxslt/extensions.c
|
|
@@ -313,8 +313,6 @@ typedef void (*exsltRegisterFunction) (void);
|
|
* by LIBXSLT_DEFAULT_PLUGINS_PATH() which is determined at
|
|
* compile time.
|
|
*
|
|
- * Always called with xsltExtMutex lock taken.
|
|
- *
|
|
* Returns 0 if successful, -1 in case of error.
|
|
*/
|
|
|
|
@@ -550,10 +548,14 @@ xsltRegisterExtPrefix(xsltStylesheetPtr style,
|
|
if (xsltExtensionsHash != NULL) {
|
|
xsltExtModulePtr module;
|
|
|
|
+ xmlMutexLock(xsltExtMutex);
|
|
module = xmlHashLookup(xsltExtensionsHash, URI);
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
if (NULL == module) {
|
|
if (!xsltExtModuleRegisterDynamic(URI)) {
|
|
+ xmlMutexLock(xsltExtMutex);
|
|
module = xmlHashLookup(xsltExtensionsHash, URI);
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
}
|
|
}
|
|
if (module != NULL) {
|
|
@@ -1669,18 +1671,13 @@ xsltExtElementLookup(xsltTransformContextPtr ctxt,
|
|
if ((name == NULL) || (URI == NULL))
|
|
return (NULL);
|
|
|
|
- xmlMutexLock(xsltExtMutex);
|
|
-
|
|
if ((ctxt != NULL) && (ctxt->extElements != NULL)) {
|
|
XML_CAST_FPTR(ret) = xmlHashLookup2(ctxt->extElements, name, URI);
|
|
if (ret != NULL) {
|
|
- xmlMutexUnlock(xsltExtMutex);
|
|
return(ret);
|
|
}
|
|
}
|
|
|
|
- xmlMutexUnlock(xsltExtMutex);
|
|
-
|
|
ret = xsltExtModuleElementLookup(name, URI);
|
|
|
|
return (ret);
|
|
@@ -1707,19 +1704,23 @@ xsltExtModuleElementLookup(const xmlChar * name, const xmlChar * URI)
|
|
|
|
ext = (xsltExtElementPtr) xmlHashLookup2(xsltElementsHash, name, URI);
|
|
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
+
|
|
/*
|
|
* if function lookup fails, attempt a dynamic load on
|
|
* supported platforms
|
|
*/
|
|
if (NULL == ext) {
|
|
if (!xsltExtModuleRegisterDynamic(URI)) {
|
|
+ xmlMutexLock(xsltExtMutex);
|
|
+
|
|
ext = (xsltExtElementPtr)
|
|
xmlHashLookup2(xsltElementsHash, name, URI);
|
|
+
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
}
|
|
}
|
|
|
|
- xmlMutexUnlock(xsltExtMutex);
|
|
-
|
|
if (ext == NULL)
|
|
return (NULL);
|
|
return (ext->transform);
|
|
@@ -1747,13 +1748,18 @@ xsltExtModuleElementPreComputeLookup(const xmlChar * name,
|
|
|
|
ext = (xsltExtElementPtr) xmlHashLookup2(xsltElementsHash, name, URI);
|
|
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
+
|
|
if (ext == NULL) {
|
|
if (!xsltExtModuleRegisterDynamic(URI)) {
|
|
+ xmlMutexLock(xsltExtMutex);
|
|
+
|
|
ext = (xsltExtElementPtr)
|
|
xmlHashLookup2(xsltElementsHash, name, URI);
|
|
+
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
}
|
|
}
|
|
- xmlMutexUnlock(xsltExtMutex);
|
|
|
|
if (ext == NULL)
|
|
return (NULL);
|
|
@@ -1856,15 +1862,19 @@ xsltExtModuleTopLevelLookup(const xmlChar * name, const xmlChar * URI)
|
|
|
|
XML_CAST_FPTR(ret) = xmlHashLookup2(xsltTopLevelsHash, name, URI);
|
|
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
+
|
|
/* if lookup fails, attempt a dynamic load on supported platforms */
|
|
if (NULL == ret) {
|
|
if (!xsltExtModuleRegisterDynamic(URI)) {
|
|
+ xmlMutexLock(xsltExtMutex);
|
|
+
|
|
XML_CAST_FPTR(ret) = xmlHashLookup2(xsltTopLevelsHash, name, URI);
|
|
+
|
|
+ xmlMutexUnlock(xsltExtMutex);
|
|
}
|
|
}
|
|
|
|
- xmlMutexUnlock(xsltExtMutex);
|
|
-
|
|
return (ret);
|
|
}
|
|
|