| /** |
| * @license |
| * Copyright 2019 The Emscripten Authors |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #if STACK_OVERFLOW_CHECK |
| // Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. |
| function writeStackCookie() { |
| var max = _emscripten_stack_get_end(); |
| #if RUNTIME_DEBUG |
| dbg(`writeStackCookie: ${ptrToString(max)}`); |
| #endif |
| #if ASSERTIONS |
| assert((max & 3) == 0); |
| #endif |
| // If the stack ends at address zero we write our cookies 4 bytes into the |
| // stack. This prevents interference with SAFE_HEAP and ASAN which also |
| // monitor writes to address zero. |
| if (max == 0) { |
| max += 4; |
| } |
| // The stack grow downwards towards _emscripten_stack_get_end. |
| // We write cookies to the final two words in the stack and detect if they are |
| // ever overwritten. |
| {{{ makeSetValue('max', 0, '0x02135467', 'u32') }}}; |
| {{{ makeSetValue('max', 4, '0x89BACDFE', 'u32') }}}; |
| #if CHECK_NULL_WRITES |
| // Also test the global address 0 for integrity. |
| {{{ makeSetValue(0, 0, 0x63736d65 /* 'emsc' */, 'u32') }}}; |
| #endif |
| } |
| |
| function checkStackCookie() { |
| #if !MINIMAL_RUNTIME |
| if (ABORT) return; |
| #endif |
| var max = _emscripten_stack_get_end(); |
| #if RUNTIME_DEBUG >= 2 |
| dbg(`checkStackCookie: ${ptrToString(max)}`); |
| #endif |
| // See writeStackCookie(). |
| if (max == 0) { |
| max += 4; |
| } |
| var cookie1 = {{{ makeGetValue('max', 0, 'u32') }}}; |
| var cookie2 = {{{ makeGetValue('max', 4, 'u32') }}}; |
| if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { |
| abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); |
| } |
| #if CHECK_NULL_WRITES |
| // Also test the global address 0 for integrity. |
| if ({{{ makeGetValue(0, 0, 'u32') }}} != 0x63736d65 /* 'emsc' */) { |
| abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); |
| } |
| #endif |
| } |
| #endif |