rpms/libxslt/F-11 libxslt-1.1.25-locking.patch, NONE, 1.1 libxslt.spec, 1.58, 1.59

Daniel Veillard veillard at fedoraproject.org
Mon Sep 21 09:12:56 UTC 2009


Author: veillard

Update of /cvs/pkgs/rpms/libxslt/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv2092

Modified Files:
	libxslt.spec 
Added Files:
	libxslt-1.1.25-locking.patch 
Log Message:
Fix lock problems in 1.1.25, Daniel


libxslt-1.1.25-locking.patch:
 extensions.c |   34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

--- NEW FILE libxslt-1.1.25-locking.patch ---
commit 2e8defa7ccef2f76fb1cbfe9e9673d8e4b6cf1d6
Author: Daniel Veillard <veillard at 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);
 }
 


Index: libxslt.spec
===================================================================
RCS file: /cvs/pkgs/rpms/libxslt/F-11/libxslt.spec,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -p -r1.58 -r1.59
--- libxslt.spec	17 Sep 2009 16:09:20 -0000	1.58
+++ libxslt.spec	21 Sep 2009 09:12:56 -0000	1.59
@@ -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,6 +132,9 @@ rm -fr %{buildroot}
 %doc python/tests/*.xsl
 
 %changelog
+* Mon Sep 21 2009 Daniel Veillard <veillard at redhat.com> 1.1.25-2
+- fix a locking bug in 1.1.25
+
 * Thu Sep 17 2009 Daniel Veillard <veillard at redhat.com> 1.1.25-1
 - release of 1.1.25
 - Add API versioning  for libxslt shared library




More information about the scm-commits mailing list