提交 bc330afd 编写于 作者: R roland

7167254: Crash on OSX in Enumerator.nextElement() with compressed oops

Summary: null checks in "compressed oops with base" mode may trigger a SIGBUS rather than a SIGSEGV.
Reviewed-by: dsamersoff, dcubed, rbackman, kvn
上级 0a5fe9a8
...@@ -522,11 +522,12 @@ JVM_handle_bsd_signal(int sig, ...@@ -522,11 +522,12 @@ JVM_handle_bsd_signal(int sig,
if ((sig == SIGSEGV || sig == SIGBUS) && os::is_poll_address((address)info->si_addr)) { if ((sig == SIGSEGV || sig == SIGBUS) && os::is_poll_address((address)info->si_addr)) {
stub = SharedRuntime::get_poll_stub(pc); stub = SharedRuntime::get_poll_stub(pc);
#if defined(__APPLE__) && !defined(AMD64) #if defined(__APPLE__)
// 32-bit Darwin reports a SIGBUS for nearly all memory access exceptions. // 32-bit Darwin reports a SIGBUS for nearly all memory access exceptions.
// 64-bit Darwin may also use a SIGBUS (seen with compressed oops).
// Catching SIGBUS here prevents the implicit SIGBUS NULL check below from // Catching SIGBUS here prevents the implicit SIGBUS NULL check below from
// being called, so only do so if the implicit NULL check is not necessary. // being called, so only do so if the implicit NULL check is not necessary.
} else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((int)info->si_addr)) { } else if (sig == SIGBUS && MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
#else #else
} else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) { } else if (sig == SIGBUS /* && info->si_code == BUS_OBJERR */) {
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册