You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
6.2 KiB
168 lines
6.2 KiB
diff -ru ucb.orig/source/ucp/webdav/NeonHeadRequest.cxx ucb/source/ucp/webdav/NeonHeadRequest.cxx
|
|
--- ucb.orig/source/ucp/webdav/NeonHeadRequest.cxx 2010-09-27 11:08:46.000000000 +0100
|
|
+++ ucb/source/ucp/webdav/NeonHeadRequest.cxx 2010-09-27 13:21:17.000000000 +0100
|
|
@@ -156,6 +156,8 @@
|
|
// Constructor
|
|
// -------------------------------------------------------------------
|
|
|
|
+extern osl::Mutex aGlobalNeonMutex;
|
|
+
|
|
NeonHeadRequest::NeonHeadRequest( HttpSession* inSession,
|
|
const rtl::OUString & inPath,
|
|
const std::vector< ::rtl::OUString > &
|
|
@@ -179,7 +181,10 @@
|
|
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 -ru ucb.orig/source/ucp/webdav/NeonSession.cxx ucb/source/ucp/webdav/NeonSession.cxx
|
|
--- ucb.orig/source/ucp/webdav/NeonSession.cxx 2010-09-27 11:08:46.000000000 +0100
|
|
+++ ucb/source/ucp/webdav/NeonSession.cxx 2010-09-27 13:26:01.000000000 +0100
|
|
@@ -618,7 +618,12 @@
|
|
// -------------------------------------------------------------------
|
|
// 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 @@
|
|
{
|
|
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 @@
|
|
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 @@
|
|
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 @@
|
|
// 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 @@
|
|
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 @@
|
|
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 @@
|
|
|
|
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 @@
|
|
|
|
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 -ru ucb.orig/source/ucp/webdav/NeonSession.hxx ucb/source/ucp/webdav/NeonSession.hxx
|
|
--- ucb.orig/source/ucp/webdav/NeonSession.hxx 2010-09-27 11:08:46.000000000 +0100
|
|
+++ ucb/source/ucp/webdav/NeonSession.hxx 2010-09-27 13:06:43.000000000 +0100
|
|
@@ -66,7 +66,6 @@
|
|
DAVRequestEnvironment m_aEnv;
|
|
|
|
static bool m_bGlobalsInited;
|
|
- static osl::Mutex m_aGlobalMutex;
|
|
static NeonLockStore m_aNeonLockStore;
|
|
|
|
protected:
|