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<sberg...@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-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
>From 0b8287d198b2603ed781efb40d6d266f529617b8 Mon Sep 17 00:00:00 2001
From: Stephan Bergmann <sberg...@redhat.com>
Date: Fri, 18 May 2012 20:52:15 +0200
Subject: [PATCH] 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.
(cherry picked from commit ef48b58387fdc04050c3362440ffe3ca0037d8d0)
Conflicts:
vcl/unx/generic/printer/cupsmgr.cxx
Change-Id: I55b95a71d622f83c975989a4ffb1d95ef5737075
---
vcl/unx/generic/printer/cupsmgr.cxx | 76 +++++++----------------------------
1 files changed, 15 insertions(+), 61 deletions(-)
diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx
index 381478d..3278d3d 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()
--
1.7.7.6
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice