未验证 提交 9e09b882 编写于 作者: K Kevin Heifner 提交者: GitHub

Merge pull request #747 from EOSIO/message-processing-recursion-limit-704

Add message processing recursion limit.
......@@ -949,7 +949,11 @@ void chain_controller::rate_limit_message(const message& message)
} FC_CAPTURE_AND_RETHROW((message)) }
void chain_controller::process_message(const transaction& trx, account_name code,
const message& message, message_output& output, apply_context* parent_context) {
const message& message, message_output& output, apply_context* parent_context, int depth) {
const blockchain_configuration& chain_configuration = get_global_properties().configuration;
EOS_ASSERT(depth < chain_configuration.in_depth_limit, msg_resource_exhausted,
"Message processing exceeded maximum inline recursion depth of ${limit}", ("limit", chain_configuration.in_depth_limit));
apply_context apply_ctx(*this, _db, trx, message, code);
apply_message(apply_ctx);
......@@ -959,7 +963,7 @@ void chain_controller::process_message(const transaction& trx, account_name code
try {
auto notify_code = apply_ctx.notified[i];
output.notify.push_back( {notify_code} );
process_message(trx, notify_code, message, output.notify.back().output, &apply_ctx);
process_message(trx, notify_code, message, output.notify.back().output, &apply_ctx, depth + 1);
} FC_CAPTURE_AND_RETHROW((apply_ctx.notified[i]))
}
......@@ -1035,7 +1039,7 @@ typename T::processed chain_controller::apply_transaction(const T& trx)
} FC_CAPTURE_AND_RETHROW((trx)) }
/**
* @pre the transaction is assumed valid and all signatures / duplicate checks have bee performed
* @pre the transaction is assumed valid and all signatures / duplicate checks have been performed
*/
template<typename T>
typename T::processed chain_controller::process_transaction( const T& trx, int depth, const fc::time_point& start_time )
......@@ -1053,7 +1057,7 @@ typename T::processed chain_controller::process_transaction( const T& trx, int d
for( uint32_t i = 0; i < trx.messages.size(); ++i ) {
auto& output = ptrx.output[i];
rate_limit_message(trx.messages[i]);
process_message(trx, trx.messages[i].code, trx.messages[i], output);
process_message(trx, trx.messages[i].code, trx.messages[i], output, 0);
if (output.inline_trx.valid() ) {
const transaction& trx = *output.inline_trx;
output.inline_trx = process_transaction(pending_inline_transaction(trx), depth + 1, start_time);
......
......@@ -387,7 +387,7 @@ namespace eosio { namespace chain {
void rate_limit_message(const message& message);
void process_message(const transaction& trx, account_name code, const message& message,
message_output& output, apply_context* parent_context = nullptr);
message_output& output, apply_context* parent_context = nullptr, int depth = 0);
void apply_message(apply_context& c);
bool should_check_for_duplicate_transactions()const { return !(_skip_flags&skip_transaction_dupe_check); }
......
......@@ -45,6 +45,7 @@ namespace eosio { namespace chain {
FC_DECLARE_DERIVED_EXCEPTION( tx_msgs_auth_exceeded, eosio::chain::transaction_exception, 3030018, "Number of transaction messages per authorized account has been exceeded" )
FC_DECLARE_DERIVED_EXCEPTION( tx_msgs_code_exceeded, eosio::chain::transaction_exception, 3030019, "Number of transaction messages per code account has been exceeded" )
FC_DECLARE_DERIVED_EXCEPTION( tx_code_db_limit_exceeded, eosio::chain::transaction_exception, 3030020, "Database storage limit for code account has been exceeded in transaction message" )
FC_DECLARE_DERIVED_EXCEPTION( msg_resource_exhausted, eosio::chain::transaction_exception, 3030021, "message exhausted allowed resources" )
FC_DECLARE_DERIVED_EXCEPTION( invalid_pts_address, eosio::chain::utility_exception, 3060001, "invalid pts address" )
FC_DECLARE_DERIVED_EXCEPTION( insufficient_feeds, eosio::chain::chain_exception, 37006, "insufficient feeds" )
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册