未验证 提交 02212951 编写于 作者: W wanderingbort 提交者: GitHub

Merge pull request #1083 from EOSIO/reset-wasm-globals

Reset WASM globals on each invocation
......@@ -308,6 +308,7 @@ namespace eosio { namespace chain {
memset( memstart + info.mem_end, 0, ((1<<16) - info.mem_end) );
memcpy( memstart, info.mem_image.data(), info.mem_end);
}
resetGlobalInstances(entry.instance);
// under a lock, put this entry back in the available instances side of the instances vector
with_lock([&,this](){
......
......@@ -216,6 +216,7 @@ namespace Runtime
RUNTIME_API TableInstance* getDefaultTable(ModuleInstance* moduleInstance);
RUNTIME_API void runInstanceStartFunc(ModuleInstance* moduleInstance);
RUNTIME_API void resetGlobalInstances(ModuleInstance* moduleInstance);
// Gets an object exported by a ModuleInstance by name.
RUNTIME_API ObjectInstance* getInstanceExport(ModuleInstance* moduleInstance,const std::string& name);
......
......@@ -204,6 +204,11 @@ namespace Runtime
if(moduleInstance->startFunctionIndex != UINTPTR_MAX)
invokeFunction(moduleInstance->functions[moduleInstance->startFunctionIndex],{});
}
void resetGlobalInstances(ModuleInstance* moduleInstance) {
for(GlobalInstance*& gi : moduleInstance->globals)
memcpy(&gi->value, &gi->initialValue, sizeof(gi->value));
}
ObjectInstance* getInstanceExport(ModuleInstance* moduleInstance,const std::string& name)
{
......
......@@ -97,8 +97,9 @@ namespace Runtime
{
GlobalType type;
UntaggedValue value;
UntaggedValue initialValue;
GlobalInstance(GlobalType inType,UntaggedValue inValue): GCObject(ObjectKind::global), type(inType), value(inValue) {}
GlobalInstance(GlobalType inType,UntaggedValue inValue): GCObject(ObjectKind::global), type(inType), value(inValue), initialValue(value) {}
};
// An instance of a WebAssembly module.
......
......@@ -53,4 +53,30 @@ static const char simple_no_memory_wast[] = R"=====(
)
)
)
)=====";
static const char mutable_global_wast[] = R"=====(
(module
(import "env" "assert" (func $assert (param i32 i32)))
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "init" (func $init))
(export "apply" (func $apply))
(func $init
(set_global $g0
(i32.const 444)
)
)
(func $apply (param $0 i64) (param $1 i64)
(call $assert
(i32.eq
(get_global $g0)
(i32.const 2)
)
(i32.const 0)
)
)
(global $g0 (mut i32) (i32.const 2))
)
)=====";
\ No newline at end of file
......@@ -569,7 +569,33 @@ BOOST_FIXTURE_TEST_CASE( simple_no_memory_check, tester ) try {
trx.sign(get_private_key( N(nomem), "active" ), chain_id_type());
BOOST_CHECK_THROW(control->push_transaction( trx ), wasm_execution_error);
} FC_LOG_AND_RETHROW()
//Make sure globals are all reset to their inital values
BOOST_FIXTURE_TEST_CASE( check_global_reset, tester ) try {
produce_blocks(2);
create_accounts( {N(globalreset)}, asset::from_string("1000.0000 EOS") );
transfer( N(inita), N(globalreset), "10.0000 EOS", "memo" );
produce_block();
set_code(N(globalreset), mutable_global_wast);
produce_blocks(1);
signed_transaction trx;
action act;
act.account = N(globalreset);
act.name = N();
act.authorization = vector<permission_level>{{N(globalreset),config::active_name}};
trx.actions.push_back(act);
set_tapos(trx);
trx.sign(get_private_key( N(globalreset), "active" ), chain_id_type());
control->push_transaction(trx);
produce_blocks(1);
BOOST_REQUIRE_EQUAL(true, chain_has_transaction(trx.id()));
const auto& receipt = get_transaction_receipt(trx.id());
BOOST_CHECK_EQUAL(transaction_receipt::executed, receipt.status);
} FC_LOG_AND_RETHROW()
BOOST_AUTO_TEST_SUITE_END()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册