[REVIEW-3-5] Revert fix for "#i86306# prepare against really broken CUPS installations..."
Stephan Bergmann
sbergman at redhat.com
Fri May 18 14:08:28 PDT 2012
Please review the below master fix for backporting to libreoffice-3-5.
(I actually first encountered the problem on the LO 3.5 codeline.)
The below master commit will not cleanly apply to libreoffice-3-5 (at
least not to libreoffice-3-5-4, where I tried it), so find attached an
adapted 0001-Revert-fix-for-i86306-prepare-against-really-broken-.patch.
Thanks,
Stephan
On 05/18/2012 09:12 PM, Stephan Bergmann wrote:
> vcl/unx/generic/printer/cupsmgr.cxx | 76 +++++++-----------------------------
> 1 file changed, 15 insertions(+), 61 deletions(-)
>
> New commits:
> commit ef48b58387fdc04050c3362440ffe3ca0037d8d0
> Author: Stephan Bergmann<sbergman at redhat.com>
> Date: Fri May 18 20:52:15 2012 +0200
>
> Revert fix for "#i86306# prepare against really broken CUPS installations..."
>
> ...from 8046a87ecc879651ee9cf344211cdd198a419cab. At least sometimes in
> sw_complex test (with various bundled Java extensions enabled) under load, this
> code reports "Signal 11 during cups initialization called, ignoring cups" and
> in-process JVM aborts in panic. Looks like a legitimate SIGSEGV (to be
> translated into java.lang.NullPointerException) from JVM code is erroneously
> caught by the temporary lcl_signal_action in cupsmgr.cxx instead. As there is
> no non-cooperative way to have different signal handlers for different threads
> (at least under POSIX), and
> <https://issues.apache.org/ooo/show_bug.cgi?id=86306> "office crashes at startup
> on Solaris Intel" suggests this signal-catching business is only there to work
> around a completely broken machine, I think it is best to simply remove it
> again.
>
> Change-Id: I55b95a71d622f83c975989a4ffb1d95ef5737075
>
> diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx
> index a0e020a..0f45b46 100644
> --- a/vcl/unx/generic/printer/cupsmgr.cxx
> +++ b/vcl/unx/generic/printer/cupsmgr.cxx
> @@ -43,8 +43,6 @@
> #include "rtl/ustrbuf.hxx"
>
> #include<algorithm>
> -#include<setjmp.h>
> -#include<signal.h>
>
> #define CUPS_LIB_NAME "libcups.so.2"
>
> @@ -442,17 +440,6 @@ void CUPSManager::runDestThread( void* pThis )
> ((CUPSManager*)pThis)->runDests();
> }
>
> -static sigjmp_buf aViolationBuffer;
> -
> -extern "C"
> -{
> - static void lcl_signal_action(int nSignal)
> - {
> - fprintf( stderr, "Signal %d during cups initialization called, ignoring cups\n", nSignal );
> - siglongjmp( aViolationBuffer, 1 );
> - }
> -}
> -
> void CUPSManager::runDests()
> {
> #if OSL_DEBUG_LEVEL> 1
> @@ -460,62 +447,29 @@ void CUPSManager::runDests()
> #endif
> cups_dest_t* pDests = NULL;
>
> - // #i86306# prepare against really broken CUPS installations / missing servers
> -
> - // install signal handler for SEGV, BUS and ABRT
> - struct sigaction act;
> - struct sigaction oact[3];
> -
> - act.sa_handler = lcl_signal_action;
> - act.sa_flags = 0;
> - sigemptyset(&(act.sa_mask));
> -
> - int nSegvSignalInstalled = sigaction(SIGSEGV,&act,&oact[0]);
> - int nBusSignalInstalled = sigaction(SIGBUS,&act,&oact[1]);
> - int nAbortSignalInstalled = sigaction(SIGABRT,&act,&oact[2]);
> -
> - // prepare against a signal during FcInit or FcConfigGetCurrent
> - if( sigsetjmp( aViolationBuffer, ~0 ) == 0 )
> + // n#722902 - do a fast-failing check for cups working *at all* first
> + http_t* p_http;
> + if( (p_http=m_pCUPSWrapper->httpConnectEncrypt(
> + m_pCUPSWrapper->cupsServer(),
> + m_pCUPSWrapper->ippPort(),
> + m_pCUPSWrapper->cupsEncryption())) != NULL )
> {
> - // n#722902 - do a fast-failing check for cups working *at
> - // all* first
> - http_t* p_http;
> - if( (p_http=m_pCUPSWrapper->httpConnectEncrypt(
> - m_pCUPSWrapper->cupsServer(),
> - m_pCUPSWrapper->ippPort(),
> - m_pCUPSWrapper->cupsEncryption())) != NULL )
> - {
> - // neat, cups is up, clean up the canary
> - m_pCUPSWrapper->httpClose(p_http);
> + // neat, cups is up, clean up the canary
> + m_pCUPSWrapper->httpClose(p_http);
>
> - int nDests = m_pCUPSWrapper->cupsGetDests(&pDests );
> + int nDests = m_pCUPSWrapper->cupsGetDests(&pDests );
> #if OSL_DEBUG_LEVEL> 1
> - fprintf( stderr, "came out of cupsGetDests\n" );
> + fprintf( stderr, "came out of cupsGetDests\n" );
> #endif
>
> - osl::MutexGuard aGuard( m_aCUPSMutex );
> - m_nDests = nDests;
> - m_pDests = pDests;
> - m_bNewDests = true;
> + osl::MutexGuard aGuard( m_aCUPSMutex );
> + m_nDests = nDests;
> + m_pDests = pDests;
> + m_bNewDests = true;
> #if OSL_DEBUG_LEVEL> 1
> - fprintf( stderr, "finished cupsGetDests\n" );
> + fprintf( stderr, "finished cupsGetDests\n" );
> #endif
> - }
> }
> - else
> - {
> - #if OSL_DEBUG_LEVEL> 1
> - fprintf( stderr, "cupsGetDests crashed, not using CUPS\n" );
> - #endif
> - }
> -
> - // restore old signal handlers
> - if( nSegvSignalInstalled == 0 )
> - sigaction( SIGSEGV,&oact[0], NULL );
> - if( nBusSignalInstalled == 0 )
> - sigaction( SIGBUS,&oact[1], NULL );
> - if( nAbortSignalInstalled == 0 )
> - sigaction( SIGABRT,&oact[2], NULL );
> }
>
> void CUPSManager::initialize()
> _______________________________________________
> Libreoffice-commits mailing list
> Libreoffice-commits at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
More information about the LibreOffice
mailing list