mirror of
https://git.proxmox.com/git/wasi-libc
synced 2025-07-29 13:09:16 +00:00
Add a check to reactor modules to ensure _initialize is only called once (#388)
Calling _initialize multiple times is undefined behavior, since the ctors are not guaranteed to be idempotent. We should have this safety check which is similar to #329.
This commit is contained in:
parent
b4814997f6
commit
9bec2d3aff
@ -1,7 +1,27 @@
|
|||||||
|
#if defined(_REENTRANT)
|
||||||
|
#include <stdatomic.h>
|
||||||
|
extern void __wasi_init_tp(void);
|
||||||
|
#endif
|
||||||
extern void __wasm_call_ctors(void);
|
extern void __wasm_call_ctors(void);
|
||||||
|
|
||||||
__attribute__((export_name("_initialize")))
|
__attribute__((export_name("_initialize")))
|
||||||
void _initialize(void) {
|
void _initialize(void) {
|
||||||
|
#if defined(_REENTRANT)
|
||||||
|
static volatile atomic_int initialized = 0;
|
||||||
|
int expected = 0;
|
||||||
|
if (!atomic_compare_exchange_strong(&initialized, &expected, 1)) {
|
||||||
|
__builtin_trap();
|
||||||
|
}
|
||||||
|
|
||||||
|
__wasi_init_tp();
|
||||||
|
#else
|
||||||
|
static volatile int initialized = 0;
|
||||||
|
if (initialized != 0) {
|
||||||
|
__builtin_trap();
|
||||||
|
}
|
||||||
|
initialized = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
// The linker synthesizes this to call constructors.
|
// The linker synthesizes this to call constructors.
|
||||||
__wasm_call_ctors();
|
__wasm_call_ctors();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user