[ooo-build-commit] .: ucb/source

Caolán McNamara caolan at kemper.freedesktop.org
Thu Sep 30 12:26:01 PDT 2010


 ucb/source/ucp/webdav/NeonHeadRequest.cxx |    7 ++-
 ucb/source/ucp/webdav/NeonSession.cxx     |   66 ++++++++++++++++++------------
 ucb/source/ucp/webdav/NeonSession.hxx     |    1 
 3 files changed, 47 insertions(+), 27 deletions(-)

New commits:
commit 3c03b1aaf26f8f65b1636f76cf6068661f4496e8
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Sep 30 20:24:11 2010 +0100

    forced to make certain neon api calls thread-safe due to cups
    
    rhbz#637738 libgcrypt that's been initialized already by cups to be
    non-threadsafe is therefore then also non-threadsafe. neon uses
    libgcrypt. So in the (as this is the usual circumstance) case that
    cups is initialized before neon, then libgcrypt is not threadsafe
    even though neon attempt to initialize it as such.

diff --git a/ucb/source/ucp/webdav/NeonHeadRequest.cxx b/ucb/source/ucp/webdav/NeonHeadRequest.cxx
index 4b29afa..c3f4be9 100644
--- a/ucb/source/ucp/webdav/NeonHeadRequest.cxx
+++ b/ucb/source/ucp/webdav/NeonHeadRequest.cxx
@@ -156,6 +156,8 @@ extern "C" void NHR_ResponseHeaderCatcher( void * userdata,
 // Constructor
 // -------------------------------------------------------------------
 
+extern osl::Mutex aGlobalNeonMutex;
+
 NeonHeadRequest::NeonHeadRequest( HttpSession* inSession,
                                   const rtl::OUString & inPath,
                                   const std::vector< ::rtl::OUString > &
@@ -179,7 +181,10 @@ NeonHeadRequest::NeonHeadRequest( HttpSession* inSession,
     ne_add_response_header_catcher( req, NHR_ResponseHeaderCatcher, &aCtx );
 #endif
 
-    nError = ne_request_dispatch( req );
+    {
+        osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+        nError = ne_request_dispatch( req );
+    }
 
 #if NEON_VERSION >= 0x0250
     process_headers(req, ioResource, inHeaderNames);
diff --git a/ucb/source/ucp/webdav/NeonSession.cxx b/ucb/source/ucp/webdav/NeonSession.cxx
index 254fae5..2c70703 100644
--- a/ucb/source/ucp/webdav/NeonSession.cxx
+++ b/ucb/source/ucp/webdav/NeonSession.cxx
@@ -618,7 +618,12 @@ extern "C" void NeonSession_PreSendRequest( ne_request * req,
 // -------------------------------------------------------------------
 // static members!
 bool NeonSession::m_bGlobalsInited = false;
-osl::Mutex NeonSession::m_aGlobalMutex;
+//See https://bugzilla.redhat.com/show_bug.cgi?id=544619#c4
+//neon is threadsafe, but uses gnutls which is only thread-safe
+//if initialized to be thread-safe. cups, unfortunately, generally
+//initializes it first, and as non-thread-safe, leaving the entire
+//stack unsafe
+osl::Mutex aGlobalNeonMutex;
 NeonLockStore NeonSession::m_aNeonLockStore;
 
 // -------------------------------------------------------------------
@@ -647,7 +652,10 @@ NeonSession::~NeonSession( )
 {
     if ( m_pHttpSession )
     {
-        ne_session_destroy( m_pHttpSession );
+        {
+            osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+            ne_session_destroy( m_pHttpSession );
+        }
         m_pHttpSession = 0;
     }
     delete static_cast< RequestDataMap * >( m_pRequestData );
@@ -673,11 +681,7 @@ void NeonSession::Init()
     if ( m_pHttpSession == 0 )
     {
         // Ensure that Neon sockets are initialized
-
-        // --> tkr #151111# crashed if copy and pasted pictures from the internet
-        // ne_sock_init() was executed by two threads at the same time.
-        osl::Guard< osl::Mutex > theGlobalGuard( m_aGlobalMutex );
-        // <--
+        osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
         if ( !m_bGlobalsInited )
         {
             if ( ne_sock_init() != 0 )
@@ -726,7 +730,10 @@ void NeonSession::Init()
             m_nProxyPort = rProxyCfg.nPort;
 
             // new session needed, destroy old first
-            ne_session_destroy( m_pHttpSession );
+            {
+                osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+                ne_session_destroy( m_pHttpSession );
+            }
             m_pHttpSession = 0;
             bCreateNewSession = true;
         }
@@ -739,14 +746,15 @@ void NeonSession::Init()
         //     currently (0.22.0) neon does not allow to pass the user info
         //     to the session
 
-        m_pHttpSession = ne_session_create(
-            rtl::OUStringToOString( m_aScheme,
-                RTL_TEXTENCODING_UTF8 ).getStr(),
-            /* theUri.GetUserInfo(),
-               @@@ for FTP via HTTP proxy, but not supported by Neon */
-            rtl::OUStringToOString( m_aHostName,
-                                    RTL_TEXTENCODING_UTF8 ).getStr(),
-            m_nPort );
+        {
+            osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+            m_pHttpSession = ne_session_create(
+                rtl::OUStringToOString( m_aScheme, RTL_TEXTENCODING_UTF8 ).getStr(),
+                /* theUri.GetUserInfo(),
+                   @@@ for FTP via HTTP proxy, but not supported by Neon */
+                rtl::OUStringToOString( m_aHostName, RTL_TEXTENCODING_UTF8 ).getStr(),
+                m_nPort );
+        }
 
         if ( m_pHttpSession == 0 )
             throw DAVException( DAVException::DAV_SESSION_CREATE,
@@ -1638,12 +1646,11 @@ bool NeonSession::UNLOCK( NeonLock * pLock )
 void NeonSession::abort()
     throw ( DAVException )
 {
-    // 11.11.09 (tkr): The following code lines causing crashes if
-    // closing a ongoing connection. It turned out that this existing
-    // solution doesn't work in multi-threading environments.
-    // So I disabled them in 3.2. . Issue #73893# should fix it in OOo 3.3.
-    //if ( m_pHttpSession )
-    //    ne_close_connection( m_pHttpSession );
+    if ( m_pHttpSession )
+    {
+        osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+        ne_close_connection( m_pHttpSession );
+    }
 }
 
 // -------------------------------------------------------------------
@@ -1934,7 +1941,10 @@ int NeonSession::GET( ne_session * sess,
     ne_decompress * dc
         = ne_decompress_reader( req, ne_accept_2xx, reader, userdata );
 
-    ret = ne_request_dispatch( req );
+    {
+        osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+        ret = ne_request_dispatch( req );
+    }
 
 #if NEON_VERSION >= 0x0250
     if ( getheaders )
@@ -1974,7 +1984,10 @@ int NeonSession::PUT( ne_session * sess,
 
     ne_set_request_body_buffer( req, buffer, size );
 
-    ret = ne_request_dispatch( req );
+    {
+        osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+        ret = ne_request_dispatch( req );
+    }
 
     if ( ret == NE_OK && ne_get_status( req )->klass != 2 )
         ret = NE_ERROR;
@@ -2019,7 +2032,10 @@ int NeonSession::POST( ne_session * sess,
 
     ne_set_request_body_buffer( req, buffer, strlen( buffer ) );
 
-    ret = ne_request_dispatch( req );
+    {
+        osl::Guard< osl::Mutex > theGlobalGuard( aGlobalNeonMutex );
+        ret = ne_request_dispatch( req );
+    }
 
     //if ( ctx.error )
     //    ret = NE_ERROR;
diff --git a/ucb/source/ucp/webdav/NeonSession.hxx b/ucb/source/ucp/webdav/NeonSession.hxx
index 1037243..1833d7e 100644
--- a/ucb/source/ucp/webdav/NeonSession.hxx
+++ b/ucb/source/ucp/webdav/NeonSession.hxx
@@ -66,7 +66,6 @@ private:
     DAVRequestEnvironment m_aEnv;
 
     static bool          m_bGlobalsInited;
-    static osl::Mutex m_aGlobalMutex;
     static NeonLockStore m_aNeonLockStore;
 
 protected:


More information about the ooo-build-commit mailing list