diff --git a/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp b/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp index b7f54f94607d4207eee7268c59279bb88080426b..d33d821ea067b8c486dcaf6baed0f113cbe6bf13 100644 --- a/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp +++ b/libraries/chain/include/eosio/chain/wasm_eosio_injection.hpp @@ -79,6 +79,9 @@ namespace eosio { namespace chain { namespace wasm_injections { if ( module.exports[i].kind == IR::ObjectKind::function ) module.exports[i].index++; } + // shift the start index by 1 + module.startFunctionIndex++; + // shift all table entries for call indirect for(TableSegment& ts : module.tableSegments) { for(auto& idx : ts.indices) @@ -90,7 +93,7 @@ namespace eosio { namespace chain { namespace wasm_injections { } } }; - + struct noop_injection_visitor { static void inject( IR::Module& m ); static void initializer(); @@ -189,6 +192,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::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; } diff --git a/libraries/chain/wasm_eosio_injection.cpp b/libraries/chain/wasm_eosio_injection.cpp index e205af77c0885744486b3e6f4d437f0b91c6c774..dabaf32bdee51c672b45b7e7bfb17cd6f9c03bc9 100644 --- a/libraries/chain/wasm_eosio_injection.cpp +++ b/libraries/chain/wasm_eosio_injection.cpp @@ -37,5 +37,4 @@ void max_memory_injection_visitor::initializer() {} uint32_t instruction_counter::icnt = 0; int32_t checktime_injector::checktime_idx = -1; - }}} // namespace eosio, chain, injectors diff --git a/tests/wasm_tests/test_wasts.hpp b/tests/wasm_tests/test_wasts.hpp index acbad45e18c516527ed5db95d40f557b1708eb75..abe14973e1e802ec6b22c706d7e604e3d00cd3ef 100644 --- a/tests/wasm_tests/test_wasts.hpp +++ b/tests/wasm_tests/test_wasts.hpp @@ -16,6 +16,48 @@ static const char f32_add_wast[] = R"=====( ) )====="; */ + +static const char start_index_wast[] = R"=====( +(module + (import "env" "require_auth" (func $require_auth (param i64))) + (import "env" "eosio_assert" (func $eosio_assert (param i32 i32))) + (import "env" "now" (func $now (result i32))) + (table 0 anyfunc) + (memory $0 1) + (export "memory" (memory $0)) + (export "entry" (func $entry)) + (export "apply" (func $apply)) + (func $entry + (block + (call $eosio_assert + (i32.eq + (i32.load offset=4 + (i32.const 0) + ) + (call $now) + ) + (i32.const 0) + ) + ) + ) + (func $apply (param $0 i64) (param $1 i64) (param $2 i64) + (call $require_auth (i64.const 6121376101093867520)) + (block + (call $eosio_assert + (i32.eq + (i32.load offset=4 + (i32.const 0) + ) + (call $now) + ) + (i32.const 0) + ) + ) + ) + (start $entry) +) +)====="; + static const char entry_wast[] = R"=====( (module (import "env" "require_auth" (func $require_auth (param i64))) diff --git a/tests/wasm_tests/wasm_tests.cpp b/tests/wasm_tests/wasm_tests.cpp index f85d09c8c826f18cd3d9cf9393a7bdbecd8acf05..61cb363aed8328c526a5c57c48ff5471164de4b3 100644 --- a/tests/wasm_tests/wasm_tests.cpp +++ b/tests/wasm_tests/wasm_tests.cpp @@ -612,6 +612,31 @@ BOOST_FIXTURE_TEST_CASE( check_entry_behavior, TESTER ) try { BOOST_CHECK_EQUAL(transaction_receipt::executed, receipt.status); } FC_LOG_AND_RETHROW() +BOOST_FIXTURE_TEST_CASE( check_start_index_behavior, TESTER ) try { + produce_blocks(2); + create_accounts( {N(check)} ); + produce_block(); + + set_code(N(check), start_index_wast); + produce_blocks(10); + + signed_transaction trx; + action act; + act.account = N(check); + act.name = N(); + act.authorization = vector{{N(check),config::active_name}}; + trx.actions.push_back(act); + + set_transaction_headers(trx); + trx.sign(get_private_key( N(check), "active" ), chain_id_type()); + 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() + + /** * Ensure we can load a wasm w/o memory */