diff options
-rw-r--r-- | src/interp/interp.cc | 12 | ||||
-rw-r--r-- | test/binary/bad-data-size.txt | 1 |
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 |