summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interp/interp.cc12
-rw-r--r--test/binary/bad-data-size.txt1
2 files changed, 10 insertions, 3 deletions
diff --git a/src/interp/interp.cc b/src/interp/interp.cc
index bd9fbb2c..4c38b2e1 100644
--- a/src/interp/interp.cc
+++ b/src/interp/interp.cc
@@ -845,6 +845,10 @@ Instance::Ptr Instance::Instantiate(Store& store,
}
// Initialization.
+ // The MVP requires that all segments are bounds-checked before being copied
+ // into the table or memory. The bulk memory proposal changes this behavior;
+ // instead, each segment is copied in order. If any segment fails, then no
+ // further segments are copied. Any data that was written persists.
enum Pass { Check, Init };
int pass = store.features().bulk_memory_enabled() ? Init : Check;
for (; pass <= Init; ++pass) {
@@ -860,7 +864,9 @@ Instance::Ptr Instance::Instantiate(Store& store,
: Result::Error;
} else {
result = table->Init(store, offset, segment, 0, segment.size());
- segment.Drop();
+ if (Succeeded(result)) {
+ segment.Drop();
+ }
}
if (Failed(result)) {
@@ -891,7 +897,9 @@ Instance::Ptr Instance::Instantiate(Store& store,
: Result::Error;
} else {
result = memory->Init(offset, segment, 0, segment.size());
- segment.Drop();
+ if (Succeeded(result)) {
+ segment.Drop();
+ }
}
if (Failed(result)) {
diff --git a/test/binary/bad-data-size.txt b/test/binary/bad-data-size.txt
index 3c82ea01..0d6d88ef 100644
--- a/test/binary/bad-data-size.txt
+++ b/test/binary/bad-data-size.txt
@@ -1,5 +1,4 @@
;;; TOOL: run-gen-wasm-interp
-;;; ARGS1: --disable-bulk-memory
;;; ERROR: 1
magic
version