summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-02-03 11:36:26 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-02-03 11:36:26 -0800
commit83b368381eb1e9e499f213129627d0c188d0008f (patch)
treee44b0a4ea0990959df56084c7d2ac821caa4c932 /src/wasm-interpreter.h
parent6dab47590562df6e542ff3f0c105db138b8f4fd9 (diff)
parent136cb714d38df62f7f100904a8088a425ff6ae93 (diff)
downloadbinaryen-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.h20
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;
}