summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2010-09-30 20:24:11 +0100
committerCaolán McNamara <caolanm@redhat.com>2010-09-30 20:24:11 +0100
commit510da29131e56ba0e1783e505e7131e6f7e0d6b4 (patch)
tree39c6c27fdd0d10f686d42d05d1d634f585fb34c9
parent5175ae0f49b98c8d93a85b6b3ec5f5ea1bfe743e (diff)
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.
-rw-r--r--ucb/source/ucp/webdav/NeonHeadRequest.cxx7
-rw-r--r--ucb/source/ucp/webdav/NeonSession.cxx66
-rw-r--r--ucb/source/ucp/webdav/NeonSession.hxx1
3 files changed, 47 insertions, 27 deletions
diff --git a/ucb/source/ucp/webdav/NeonHeadRequest.cxx b/ucb/source/ucp/webdav/NeonHeadRequest.cxx
index 2880a86a727d..df78207a3489 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 254fae546940..2c70703b5bdc 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 65c2c25e4ec9..ae8d93217aa1 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: