diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-02-03 11:36:26 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-02-03 11:36:26 -0800 |
commit | 83b368381eb1e9e499f213129627d0c188d0008f (patch) | |
tree | e44b0a4ea0990959df56084c7d2ac821caa4c932 /src/wasm-interpreter.h | |
parent | 6dab47590562df6e542ff3f0c105db138b8f4fd9 (diff) | |
parent | 136cb714d38df62f7f100904a8088a425ff6ae93 (diff) | |
download | binaryen-83b368381eb1e9e499f213129627d0c188d0008f.tar.gz binaryen-83b368381eb1e9e499f213129627d0c188d0008f.tar.bz2 binaryen-83b368381eb1e9e499f213129627d0c188d0008f.zip |
Merge remote-tracking branch 'origin/improve-memory-trap'
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r-- | src/wasm-interpreter.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 693135962..7f441c115 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -24,6 +24,7 @@ #define wasm_wasm_interpreter_h #include <limits.h> +#include <sstream> #include "support/bits.h" #include "wasm.h" @@ -765,14 +766,21 @@ private: size_t memorySize; - template<class LS> - size_t getFinalAddress(LS *curr, Literal ptr) { + template <class LS> + size_t getFinalAddress(LS* curr, Literal ptr) { + auto trapIfGt = [this](size_t lhs, size_t rhs, const char* msg) { + if (lhs > rhs) { + std::stringstream ss; + ss << msg << ": " << lhs << " > " << rhs; + externalInterface->trap(ss.str().c_str()); + } + }; uint64_t addr = ptr.type == i32 ? ptr.geti32() : ptr.geti64(); - if (memorySize < curr->offset) externalInterface->trap("offset > memory"); - if (addr > memorySize - curr->offset) externalInterface->trap("final > memory"); + trapIfGt(curr->offset, memorySize, "offset > memory"); + trapIfGt(addr, memorySize - curr->offset, "final > memory"); addr += curr->offset; - if (curr->bytes > memorySize) externalInterface->trap("bytes > memory"); - if (addr > memorySize - curr->bytes) externalInterface->trap("highest > memory"); + trapIfGt(curr->bytes, memorySize, "bytes > memory"); + trapIfGt(addr, memorySize - curr->bytes, "highest > memory"); return addr; } |