diff --git a/libxslt-1.1.25-locking.patch b/libxslt-1.1.25-locking.patch new file mode 100644 index 0000000..9c8f5fe --- /dev/null +++ b/libxslt-1.1.25-locking.patch @@ -0,0 +1,125 @@ +commit 2e8defa7ccef2f76fb1cbfe9e9673d8e4b6cf1d6 +Author: Daniel Veillard +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); + } + diff --git a/libxslt.spec b/libxslt.spec index 57a82ba..2a4d5a9 100644 --- a/libxslt.spec +++ b/libxslt.spec @@ -1,7 +1,7 @@ Summary: Library providing the Gnome XSLT engine Name: libxslt Version: 1.1.25 -Release: 1%{?dist}%{?extra_release} +Release: 2%{?dist}%{?extra_release} License: MIT Group: Development/Libraries Source: ftp://xmlsoft.org/XSLT/libxslt-%{version}.tar.gz @@ -15,6 +15,7 @@ BuildRequires: libgcrypt-devel Prefix: %{_prefix} Docdir: %{_docdir} Patch0: multilib.patch +Patch1: libxslt-1.1.25-locking.patch %description This C library allows to transform XML files into other XML files @@ -56,6 +57,7 @@ with XPath functions written in Python. %prep %setup -q %patch0 -p1 +%patch1 -p1 %build %configure @@ -130,7 +132,10 @@ rm -fr %{buildroot} %doc python/tests/*.xsl %changelog -* Thu Sep 17 2009 Daniel Veillard 1.1.24-1 +* Mon Sep 21 2009 Daniel Veillard 1.1.25-2 +- fix a locking bug in 1.1.25 + +* Thu Sep 17 2009 Daniel Veillard 1.1.25-1 - release of 1.1.25 - Add API versioning for libxslt shared library - xsl:sort lang support using the locale