diff options
author | Daniel Veillard <veillard@redhat.com> | 2009-09-20 11:51:52 +0200 |
---|---|---|
committer | Daniel Veillard <veillard@redhat.com> | 2009-09-20 11:51:52 +0200 |
commit | 2e8defa7ccef2f76fb1cbfe9e9673d8e4b6cf1d6 (patch) | |
tree | a0c04841a684b0e69f022640b20d0e38438a8cd1 | |
parent | f44c92bfb91695ccfffd95b7e358c8740d413b19 (diff) | |
download | libxslt-2e8defa7ccef2f76fb1cbfe9e9673d8e4b6cf1d6.tar.gz |
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
-rw-r--r-- | libxslt/extensions.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/libxslt/extensions.c b/libxslt/extensions.c index ebb81f52..6187b7af 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); } |