parent
ba5654215a
commit
b0a09199da
@ -0,0 +1,116 @@
|
|||||||
|
From 9ff4c35f1d8e7e603b23245afb6947b8260fabfc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stephan Bergmann <sbergman@redhat.com>
|
||||||
|
Date: Fri, 23 Aug 2013 12:03:45 +0200
|
||||||
|
Subject: [PATCH] rhbz#1000150: Do not call exit upon XIOError
|
||||||
|
|
||||||
|
...as done in _XIOError (libX11-1.6.0/src/XlibInt.c) after calling the XIOError
|
||||||
|
handler function (either the one supplied with XSetIOErrorHandler or
|
||||||
|
_XDefaultIOError), as that calls the atexit handlers, which can wreak havoc in
|
||||||
|
unrelated threads that happen to be running in parallel, leading to arbitrary
|
||||||
|
crashes. So avoid that by always calling _exit already from our XIOError
|
||||||
|
handler.
|
||||||
|
|
||||||
|
The old code was careful to /not/ call _exit when the XIOError happened on any
|
||||||
|
thread but the main one, but I do not see the sense of that---after all,
|
||||||
|
_XIOError will inevitably call exit afterwards, so this cannot be a way to
|
||||||
|
"ignore" XIOErrors from special threads (that are set up say for the sole
|
||||||
|
purpose of trying out "known-shaky" activities without affecting the stability
|
||||||
|
of the whole process). And findings like comment 12 to
|
||||||
|
<https://bugzilla.redhat.com/show_bug.cgi?id=831628#c12> "[abrt]
|
||||||
|
libreoffice-core-3.5.4.2-1.fc17: ICEConnectionWorker thread still running during
|
||||||
|
exit" ("it is very likely that this is not a normal exit from reaching the end
|
||||||
|
of main, but rather some explicit call to exit from some error handling code")
|
||||||
|
make it clear that we apparenly do suffer from such calls to _XIOError -> exit
|
||||||
|
on non-main threads.
|
||||||
|
|
||||||
|
I have no idea why vcl/unx/gtk has its own XIOErrorHdl that is substantially
|
||||||
|
different from the vcl/unx/generic one, though.
|
||||||
|
|
||||||
|
cherry picked from commit ffea65915b9cc6d4f3c01f829552702654a040f9, plus
|
||||||
|
follow-up b240a1c188b58e3e717335339bfc3f5e20bb2bf4:
|
||||||
|
|
||||||
|
rhbz#1000150: Do not call exit upon XIOError, take two
|
||||||
|
|
||||||
|
The _XDefaultIOError handler (libX11-1.6.0/src/XlibInt.c) already calls exit
|
||||||
|
(even though _XIOError calling _XDefaultIOError would call exit afterwards,
|
||||||
|
too), so our XIOError handler must not call aOrigXIOErrorHandler.
|
||||||
|
|
||||||
|
Change-Id: Ida7d407cf5f0fa4e719118cab5e725144ceb3a35
|
||||||
|
---
|
||||||
|
vcl/unx/generic/app/saldata.cxx | 25 +++++++++++--------------
|
||||||
|
vcl/unx/gtk/app/gtkdata.cxx | 12 +++++-------
|
||||||
|
2 files changed, 16 insertions(+), 21 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/vcl/unx/generic/app/saldata.cxx b/vcl/unx/generic/app/saldata.cxx
|
||||||
|
index 3d91586..9b5e200 100644
|
||||||
|
--- a/vcl/unx/generic/app/saldata.cxx
|
||||||
|
+++ b/vcl/unx/generic/app/saldata.cxx
|
||||||
|
@@ -307,22 +307,19 @@ int X11SalData::XErrorHdl( Display *pDisplay, XErrorEvent *pEvent )
|
||||||
|
|
||||||
|
int X11SalData::XIOErrorHdl( Display * )
|
||||||
|
{
|
||||||
|
- if (::osl::Thread::getCurrentIdentifier() != Application::GetMainThreadIdentifier())
|
||||||
|
+ if (::osl::Thread::getCurrentIdentifier() == Application::GetMainThreadIdentifier())
|
||||||
|
{
|
||||||
|
- pthread_exit(NULL);
|
||||||
|
- return 0;
|
||||||
|
+ /* #106197# hack: until a real shutdown procedure exists
|
||||||
|
+ * _exit ASAP
|
||||||
|
+ */
|
||||||
|
+ if( ImplGetSVData()->maAppData.mbAppQuit )
|
||||||
|
+ _exit(1);
|
||||||
|
+
|
||||||
|
+ // really bad hack
|
||||||
|
+ if( ! SessionManagerClient::checkDocumentsSaved() )
|
||||||
|
+ /* oslSignalAction eToDo = */ osl_raiseSignal (OSL_SIGNAL_USER_X11SUBSYSTEMERROR, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* #106197# hack: until a real shutdown procedure exists
|
||||||
|
- * _exit ASAP
|
||||||
|
- */
|
||||||
|
- if( ImplGetSVData()->maAppData.mbAppQuit )
|
||||||
|
- _exit(1);
|
||||||
|
-
|
||||||
|
- // really bad hack
|
||||||
|
- if( ! SessionManagerClient::checkDocumentsSaved() )
|
||||||
|
- /* oslSignalAction eToDo = */ osl_raiseSignal (OSL_SIGNAL_USER_X11SUBSYSTEMERROR, NULL);
|
||||||
|
-
|
||||||
|
std::fprintf( stderr, "X IO Error\n" );
|
||||||
|
std::fflush( stdout );
|
||||||
|
std::fflush( stderr );
|
||||||
|
@@ -331,7 +328,7 @@ int X11SalData::XIOErrorHdl( Display * )
|
||||||
|
* do apply here. Since there is nothing to be done after an XIO
|
||||||
|
* error we have to _exit immediately.
|
||||||
|
*/
|
||||||
|
- _exit(0);
|
||||||
|
+ _exit(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/vcl/unx/gtk/app/gtkdata.cxx b/vcl/unx/gtk/app/gtkdata.cxx
|
||||||
|
index 6abb06b..23f7931 100644
|
||||||
|
--- a/vcl/unx/gtk/app/gtkdata.cxx
|
||||||
|
+++ b/vcl/unx/gtk/app/gtkdata.cxx
|
||||||
|
@@ -511,14 +511,12 @@ GtkData::GtkData( SalInstance *pInstance )
|
||||||
|
|
||||||
|
XIOErrorHandler aOrigXIOErrorHandler = NULL;
|
||||||
|
|
||||||
|
-int XIOErrorHdl(Display *pDisplay)
|
||||||
|
+int XIOErrorHdl(Display *)
|
||||||
|
{
|
||||||
|
- if (::osl::Thread::getCurrentIdentifier() != Application::GetMainThreadIdentifier())
|
||||||
|
- {
|
||||||
|
- pthread_exit(NULL);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- return aOrigXIOErrorHandler ? aOrigXIOErrorHandler(pDisplay) : 0;
|
||||||
|
+ fprintf(stderr, "X IO Error\n");
|
||||||
|
+ _exit(1);
|
||||||
|
+ // avoid crashes in unrelated threads that still run while atexit
|
||||||
|
+ // handlers are in progress
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkData::~GtkData()
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
Loading…
Reference in new issue