未验证 提交 897e2ea1 编写于 作者: M Matt Witherspoon 提交者: GitHub

Merge pull request #2525 from larryk85/fix/wasm_start_idx_adjustment

Fix for eos #2400 (WASM injection damages start index)
......@@ -57,8 +57,7 @@ namespace eosio { namespace chain { namespace wasm_injections {
if ( exp.kind == IR::ObjectKind::function )
exports++;
next_function_index = module.functions.imports.size() + module.functions.defs.size() + registered_injected.size(); // + exports + registered_injected.size()-1;
;
next_function_index = module.functions.imports.size() + module.functions.defs.size() + registered_injected.size();
next_actual_index = next_injected_index++;
}
......@@ -75,10 +74,18 @@ namespace eosio { namespace chain { namespace wasm_injections {
module.functions.imports.insert( module.functions.imports.begin()+(registered_injected.size()-1), new_import.begin(), new_import.end() );
injected_index_mapping.emplace( index, actual_index );
// shift all exported functions by 1
bool have_updated_start = false;
for ( int i=0; i < module.exports.size(); i++ ) {
if ( module.exports[i].kind == IR::ObjectKind::function )
if ( module.exports[i].kind == IR::ObjectKind::function ) {
// update the start function
if ( !have_updated_start && module.exports[i].index == module.startFunctionIndex ) {
module.startFunctionIndex++;
have_updated_start = true;
}
module.exports[i].index++;
}
}
// shift all table entries for call indirect
for(TableSegment& ts : module.tableSegments) {
for(auto& idx : ts.indices)
......@@ -90,7 +97,7 @@ namespace eosio { namespace chain { namespace wasm_injections {
}
}
};
struct noop_injection_visitor {
static void inject( IR::Module& m );
static void initializer();
......@@ -189,6 +196,7 @@ namespace eosio { namespace chain { namespace wasm_injections {
static void accept( wasm_ops::instr* inst, wasm_ops::visitor_arg& arg ) {
wasm_ops::op_types<>::call_t* call_inst = reinterpret_cast<wasm_ops::op_types<>::call_t*>(inst);
auto mapped_index = injector_utils::injected_index_mapping.find(call_inst->field);
if ( mapped_index != injector_utils::injected_index_mapping.end() ) {
call_inst->field = mapped_index->second;
}
......
......@@ -43,7 +43,7 @@ class binaryen_instantiated_module : public wasm_instantiated_module_interface {
memset(_shared_linear_memory.data, 0, initial_memory_size);
//copy back in the initial data
memcpy(_shared_linear_memory.data, _initial_memory.data(), _initial_memory.size());
//be aware that construction of the ModuleInstance implictly fires the start function
ModuleInstance instance(*_module.get(), &local_interface);
instance.callExport(Name(entry_point), args);
......
......@@ -16,6 +16,7 @@ static const char f32_add_wast[] = R"=====(
)
)=====";
*/
static const char aligned_ref_wast[] = R"=====(
(module
(import "env" "sha256" (func $sha256 (param i32 i32 i32)))
......@@ -166,21 +167,25 @@ static const char entry_wast[] = R"=====(
(export "entry" (func $entry))
(export "apply" (func $apply))
(func $entry
(i32.store offset=4
(i32.const 0)
(call $now)
(block
(i32.store offset=4
(i32.const 0)
(call $now)
)
)
)
(func $apply (param $0 i64) (param $1 i64) (param $2 i64)
(call $require_auth (i64.const 6121376101093867520))
(call $eosio_assert
(i32.eq
(i32.load offset=4
(i32.const 0)
(block
(call $require_auth (i64.const 6121376101093867520))
(call $eosio_assert
(i32.eq
(i32.load offset=4
(i32.const 0)
)
(call $now)
)
(call $now)
(i32.const 0)
)
(i32.const 0)
)
)
(start $entry)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册