Skip to content

Commit 60f1f83

Browse files
committed
Install SIGBUS handler in safefetch test fixture
Mirrors safefetch_ut.cpp: the safefetch trampoline can fault with SIGBUS instead of SIGSEGV depending on platform, so both handlers must be registered to avoid crashing the gtest binary.
1 parent 940a14e commit 60f1f83

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

ddprof-lib/src/test/cpp/lineNumberTableCopy_ut.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,23 @@
6464

6565
namespace {
6666

67-
// SafeAccess::isReadableRange()/isReadable() rely on a SIGSEGV handler
68-
// registered via OS::replaceSigsegvHandler() to catch the fault at a known
69-
// trampoline address and turn it into a safe return value (see
70-
// safefetch_ut.cpp for the same pattern). Without it, a fault inside the
71-
// safefetch trampoline is an ordinary unhandled SIGSEGV.
67+
// SafeAccess::isReadableRange()/isReadable() rely on SIGSEGV/SIGBUS handlers
68+
// registered via OS::replaceSigsegvHandler()/replaceSigbusHandler() to catch
69+
// the fault at a known trampoline address and turn it into a safe return
70+
// value (see safefetch_ut.cpp for the same pattern). The safefetch trampoline
71+
// can fault with either signal depending on platform, so both must be
72+
// installed; otherwise a fault delivered as the other signal is an ordinary
73+
// unhandled fault.
7274
void (*orig_segvHandler)(int signo, siginfo_t *siginfo, void *ucontext);
75+
void (*orig_busHandler)(int signo, siginfo_t *siginfo, void *ucontext);
7376

7477
void lineNumberTableSegvHandler(int signo, siginfo_t *siginfo, void *context) {
7578
if (!SafeAccess::handle_safefetch(signo, context)) {
76-
if (orig_segvHandler != nullptr) {
79+
if (signo == SIGBUS) {
80+
if (orig_busHandler != nullptr) {
81+
orig_busHandler(signo, siginfo, context);
82+
}
83+
} else if (orig_segvHandler != nullptr) {
7784
orig_segvHandler(signo, siginfo, context);
7885
}
7986
}
@@ -83,9 +90,13 @@ class LineNumberTableCopyTest : public ::testing::Test {
8390
protected:
8491
void SetUp() override {
8592
orig_segvHandler = OS::replaceSigsegvHandler(lineNumberTableSegvHandler);
93+
orig_busHandler = OS::replaceSigbusHandler(lineNumberTableSegvHandler);
8694
}
8795

88-
void TearDown() override { OS::replaceSigsegvHandler(orig_segvHandler); }
96+
void TearDown() override {
97+
OS::replaceSigsegvHandler(orig_segvHandler);
98+
OS::replaceSigbusHandler(orig_busHandler);
99+
}
89100
};
90101

91102
// Allocates a page-sized region seeded with `count` jvmtiLineNumberEntry

0 commit comments

Comments
 (0)