Kaydet (Commit) ac4e8612 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Handle race in external/breakpad

...that hit once in a UBSan build in UITest_calc_tests4:

> soffice.bin: /data/sbergman/lo-san/core/include/com/sun/star/uno/Reference.h:420: interface_type *com::sun::star::uno::Reference<com::sun::star::xml::crypto::XXMLSecurityContext>::operator->() const [interface_type = com::sun::star::xml::crypto::XXMLSecurityContext]: Assertion `_pInterface != NULL' failed.
> warn:desktop:11041:11425:desktop/source/app/sofficemain.cxx:82: minidump generated: /data/sbergman/lo-san/core/workdir/UITest/calc_tests4/user/crash//0585280b-6f1e-fa99-4b711485-60baa6f1.dmp
> src/client/linux/handler/exception_handler.cc:367:34: runtime error: member call on null pointer of type 'std::vector<google_breakpad::ExceptionHandler *, std::allocator<google_breakpad::ExceptionHandler *> >'
> warn:sal.osl.mutex:11041:11041:sal/osl/unx/mutex.cxx:82: pthread_mutex_destroy failed: Device or resource busy
>  #0 in google_breakpad::ExceptionHandler::SignalHandler(int, siginfo_t*, void*) at <null> (instdir/program/libsofficeapp.so +0x963904)
> warn:unotools.config:11041:11041:unotools/source/config/configmgr.cxx:169: ConfigManager not empty
>  #1  at <null> (/lib64/libpthread.so.0 +0x11fbf)

Change-Id: Icf46adea879c0541a297e5f54f9ce936caa9858b
Reviewed-on: https://gerrit.libreoffice.org/59157
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst 2dc14bee
From caa6f1ea462d0f0c612b871106e3e309fe0290f5 Mon Sep 17 00:00:00 2001
From: Stephan Bergmann <sbergman@redhat.com>
Date: Thu, 16 Aug 2018 09:04:35 +0200
Subject: [PATCH] Handle race between ExceptionHandler::SignalHandler and
~ExceptionHandler
...where thread A is blocked locking g_handler_stack_mutex_ in SignalHandler
while thread B executes ~ExceptionHandler and sets g_handler_stack to null, but
which thread A didn't expect to be null once it acquired the lock.
---
src/client/linux/handler/exception_handler.cc | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc
index b895f6d7..4d58e510 100644
--- a/src/client/linux/handler/exception_handler.cc
+++ b/src/client/linux/handler/exception_handler.cc
@@ -372,8 +372,10 @@ void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
}
bool handled = false;
- for (int i = g_handler_stack_->size() - 1; !handled && i >= 0; --i) {
- handled = (*g_handler_stack_)[i]->HandleSignal(sig, info, uc);
+ if (g_handler_stack_ != nullptr) {
+ for (int i = g_handler_stack_->size() - 1; !handled && i >= 0; --i) {
+ handled = (*g_handler_stack_)[i]->HandleSignal(sig, info, uc);
+ }
}
// Upon returning from this signal handler, sig will become unmasked and then
--
2.17.1
...@@ -13,12 +13,16 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,breakpad,0)) ...@@ -13,12 +13,16 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,breakpad,0))
$(eval $(call gb_UnpackedTarball_set_tarball,breakpad,$(BREAKPAD_TARBALL))) $(eval $(call gb_UnpackedTarball_set_tarball,breakpad,$(BREAKPAD_TARBALL)))
# external/breakpad/0001-Handle-race-between-ExceptionHandler-SignalHandler-a.patch upstreamed at
# <https://chromium-review.googlesource.com/c/breakpad/breakpad/+/1176811> "Handle race between
# ExceptionHandler::SignalHandler and ~ExceptionHandler":
$(eval $(call gb_UnpackedTarball_add_patches,breakpad,\ $(eval $(call gb_UnpackedTarball_add_patches,breakpad,\
external/breakpad/breakpad-use-correct-http-header.patch.1 \ external/breakpad/breakpad-use-correct-http-header.patch.1 \
external/breakpad/breakpad-wshadow.patch.1 \ external/breakpad/breakpad-wshadow.patch.1 \
external/breakpad/breakpad-wshadow2.patch.1 \ external/breakpad/breakpad-wshadow2.patch.1 \
external/breakpad/breakpad-stackwalk.patch.1 \ external/breakpad/breakpad-stackwalk.patch.1 \
external/breakpad/ucontext.patch \ external/breakpad/ucontext.patch \
external/breakpad/0001-Handle-race-between-ExceptionHandler-SignalHandler-a.patch.1 \
)) ))
ifeq ($(COM_IS_CLANG),TRUE) ifeq ($(COM_IS_CLANG),TRUE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment