summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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: