summaryrefslogtreecommitdiff
path: root/wasm2c
diff options
context:
space:
mode:
authorKeith Winstein <keithw@cs.stanford.edu>2023-12-05 23:04:03 -0800
committerGitHub <noreply@github.com>2023-12-05 23:04:03 -0800
commit99c860c4baba73cfd3b816e53007ddcd9fa8cc07 (patch)
tree3c43415e7264b8fa00ffcf8ae962fa3583b32cfd /wasm2c
parent4ce790d24c8ed71a7d23e9a9b4a5fc4ba704d48e (diff)
downloadwabt-99c860c4baba73cfd3b816e53007ddcd9fa8cc07.tar.gz
wabt-99c860c4baba73cfd3b816e53007ddcd9fa8cc07.tar.bz2
wabt-99c860c4baba73cfd3b816e53007ddcd9fa8cc07.zip
wasm2c runtime: fix mis-nesting of def'n of os_has_altstack_installed (#2346)
Also adds an RLBox-like CI test where the embedder takes responsibility for signal handling Co-authored-by: wrv <wrv@utexas.edu>
Diffstat (limited to 'wasm2c')
-rw-r--r--wasm2c/wasm-rt-impl.c25
-rw-r--r--wasm2c/wasm-rt.h10
2 files changed, 20 insertions, 15 deletions
diff --git a/wasm2c/wasm-rt-impl.c b/wasm2c/wasm-rt-impl.c
index 72e4d66e..5f22d3bf 100644
--- a/wasm2c/wasm-rt-impl.c
+++ b/wasm2c/wasm-rt-impl.c
@@ -25,7 +25,8 @@
#include <stdlib.h>
#include <string.h>
-#if WASM_RT_INSTALL_SIGNAL_HANDLER && !defined(_WIN32)
+#if (WASM_RT_INSTALL_SIGNAL_HANDLER || !WASM_RT_USE_STACK_DEPTH_COUNT) && \
+ !defined(_WIN32)
#include <signal.h>
#include <unistd.h>
#endif
@@ -163,17 +164,7 @@ static void os_print_last_error(const char* msg) {
perror(msg);
}
-#if WASM_RT_INSTALL_SIGNAL_HANDLER
-static void os_signal_handler(int sig, siginfo_t* si, void* unused) {
- if (si->si_code == SEGV_ACCERR) {
- wasm_rt_trap(WASM_RT_TRAP_OOB);
- } else {
- wasm_rt_trap(WASM_RT_TRAP_EXHAUSTION);
- }
-}
-
#if !WASM_RT_USE_STACK_DEPTH_COUNT
-/* These routines set up an altstack to handle SIGSEGV from stack overflow. */
static bool os_has_altstack_installed() {
/* check for altstack already in place */
stack_t ss;
@@ -184,7 +175,19 @@ static bool os_has_altstack_installed() {
return !(ss.ss_flags & SS_DISABLE);
}
+#endif
+
+#if WASM_RT_INSTALL_SIGNAL_HANDLER
+static void os_signal_handler(int sig, siginfo_t* si, void* unused) {
+ if (si->si_code == SEGV_ACCERR) {
+ wasm_rt_trap(WASM_RT_TRAP_OOB);
+ } else {
+ wasm_rt_trap(WASM_RT_TRAP_EXHAUSTION);
+ }
+}
+#if !WASM_RT_USE_STACK_DEPTH_COUNT
+/* These routines set up an altstack to handle SIGSEGV from stack overflow. */
static void os_allocate_and_install_altstack(void) {
/* verify altstack not already allocated */
assert(!g_alt_stack &&
diff --git a/wasm2c/wasm-rt.h b/wasm2c/wasm-rt.h
index a79271e3..fe68aa1d 100644
--- a/wasm2c/wasm-rt.h
+++ b/wasm2c/wasm-rt.h
@@ -202,7 +202,7 @@ extern WASM_RT_THREAD_LOCAL uint32_t wasm_rt_call_stack_depth;
#define WASM_RT_NO_RETURN __attribute__((noreturn))
#endif
-#if defined(__APPLE__) && WASM_RT_INSTALL_SIGNAL_HANDLER
+#if defined(__APPLE__) && !WASM_RT_USE_STACK_DEPTH_COUNT
#define WASM_RT_MERGED_OOB_AND_EXHAUSTION_TRAPS 1
#else
#define WASM_RT_MERGED_OOB_AND_EXHAUSTION_TRAPS 0
@@ -218,7 +218,7 @@ typedef enum {
WASM_RT_TRAP_UNREACHABLE, /** Unreachable instruction executed. */
WASM_RT_TRAP_CALL_INDIRECT, /** Invalid call_indirect, for any reason. */
WASM_RT_TRAP_UNCAUGHT_EXCEPTION, /* Exception thrown and not caught. */
- WASM_RT_TRAP_UNALIGNED, /** Unaligned atomic instruction executed. */
+ WASM_RT_TRAP_UNALIGNED, /** Unaligned atomic instruction executed. */
#if WASM_RT_MERGED_OOB_AND_EXHAUSTION_TRAPS
WASM_RT_TRAP_EXHAUSTION = WASM_RT_TRAP_OOB,
#else
@@ -354,7 +354,8 @@ typedef struct {
jmp_buf buffer;
} wasm_rt_jmp_buf;
-#if WASM_RT_INSTALL_SIGNAL_HANDLER && !defined(_WIN32)
+#if (WASM_RT_INSTALL_SIGNAL_HANDLER || (!WASM_RT_USE_STACK_DEPTH_COUNT)) && \
+ !defined(_WIN32)
#define WASM_RT_SETJMP_SETBUF(buf) sigsetjmp(buf, 1)
#else
#define WASM_RT_SETJMP_SETBUF(buf) setjmp(buf)
@@ -363,7 +364,8 @@ typedef struct {
#define WASM_RT_SETJMP(buf) \
((buf).initialized = true, WASM_RT_SETJMP_SETBUF((buf).buffer))
-#if WASM_RT_INSTALL_SIGNAL_HANDLER && !defined(_WIN32)
+#if (WASM_RT_INSTALL_SIGNAL_HANDLER || (!WASM_RT_USE_STACK_DEPTH_COUNT)) && \
+ !defined(_WIN32)
#define WASM_RT_LONGJMP_UNCHECKED(buf, val) siglongjmp(buf, val)
#else
#define WASM_RT_LONGJMP_UNCHECKED(buf, val) longjmp(buf, val)