diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index 46e1defc60..8b93b84226 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -48,6 +48,7 @@ use namada::ledger::storage::{ DBIter, Sha256Hasher, Storage, StorageHasher, TempWlStorage, WlStorage, DB, EPOCH_SWITCH_BLOCKS_DELAY, }; +use namada::ledger::storage_api::tx::validate_tx_bytes; use namada::ledger::storage_api::{self, StorageRead}; use namada::ledger::{parameters, pos, protocol}; use namada::proof_of_stake::{self, process_slashes, read_pos_params, slash}; @@ -1071,6 +1072,15 @@ where const VALID_MSG: &str = "Mempool validation passed"; const INVALID_MSG: &str = "Mempool validation failed"; + // Tx size check + if !validate_tx_bytes(&self.wl_storage, tx_bytes.len()) + .expect("Failed to get max tx bytes param from storage") + { + response.code = ErrorCodes::TooLarge.into(); + response.log = format!("{INVALID_MSG}: Tx too large"); + return response; + } + // Tx format check let tx = match Tx::try_from(tx_bytes).map_err(Error::TxDecoding) { Ok(t) => t, diff --git a/apps/src/lib/node/ledger/shell/process_proposal.rs b/apps/src/lib/node/ledger/shell/process_proposal.rs index 4968faa050..19469d10fc 100644 --- a/apps/src/lib/node/ledger/shell/process_proposal.rs +++ b/apps/src/lib/node/ledger/shell/process_proposal.rs @@ -7,6 +7,7 @@ use namada::core::ledger::storage::WlStorage; use namada::ledger::pos::PosQueries; use namada::ledger::protocol::get_fee_unshielding_transaction; use namada::ledger::storage::TempWlStorage; +use namada::ledger::storage_api::tx::validate_tx_bytes; use namada::proof_of_stake::find_validator_by_raw_hash; use namada::types::internal::TxInQueue; use namada::types::transaction::protocol::{ @@ -457,6 +458,16 @@ where where CA: 'static + WasmCacheAccess + Sync, { + // check tx bytes + if !validate_tx_bytes(&self.wl_storage, tx_bytes.len()) + .expect("Failed to get max tx bytes param from storage") + { + return TxResult { + code: ErrorCodes::TooLarge.into(), + info: "Tx too large".into(), + }; + } + // try to allocate space for this tx if let Err(e) = metadata.txs_bin.try_dump(tx_bytes) { return TxResult {