From 35bb7933b266253ebb6778941e38f0f73c7fe534 Mon Sep 17 00:00:00 2001 From: refcell Date: Thu, 6 Feb 2025 18:11:56 -0500 Subject: [PATCH] chore(genesis): gas limit tests --- crates/genesis/src/updates/gas_limit.rs | 114 +++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) diff --git a/crates/genesis/src/updates/gas_limit.rs b/crates/genesis/src/updates/gas_limit.rs index ec3a3b54..2078a814 100644 --- a/crates/genesis/src/updates/gas_limit.rs +++ b/crates/genesis/src/updates/gas_limit.rs @@ -1,6 +1,6 @@ //! The gas limit update type. -use alloy_primitives::U64; +use alloy_primitives::{U256, U64}; use alloy_sol_types::{sol, SolType}; use crate::{GasLimitUpdateError, SystemConfig, SystemConfigLog}; @@ -46,6 +46,12 @@ impl TryFrom<&SystemConfigLog> for GasLimitUpdate { return Err(GasLimitUpdateError::GasLimitDecodingError); }; + // Prevent overflows here. + let max = U256::from(u64::MAX as u128); + if gas_limit > max { + return Err(GasLimitUpdateError::GasLimitDecodingError); + } + Ok(Self { gas_limit: U64::from(gas_limit).saturating_to::() }) } } @@ -54,7 +60,7 @@ impl TryFrom<&SystemConfigLog> for GasLimitUpdate { mod tests { use super::*; use crate::{CONFIG_UPDATE_EVENT_VERSION_0, CONFIG_UPDATE_TOPIC}; - use alloy_primitives::{hex, Address, Log, LogData, B256}; + use alloy_primitives::{hex, Address, Bytes, Log, LogData, B256}; #[test] fn test_gas_limit_update_try_from() { @@ -77,4 +83,108 @@ mod tests { assert_eq!(update.gas_limit, 0xbeef_u64); } + + #[test] + fn test_gas_limit_update_invalid_data_len() { + let log = + Log { address: Address::ZERO, data: LogData::new_unchecked(vec![], Bytes::default()) }; + let system_log = SystemConfigLog::new(log, false); + let err = GasLimitUpdate::try_from(&system_log).unwrap_err(); + assert_eq!(err, GasLimitUpdateError::InvalidDataLen(0)); + } + + #[test] + fn test_gas_limit_update_pointer_decoding_error() { + let log = Log { + address: Address::ZERO, + data: LogData::new_unchecked( + vec![ + CONFIG_UPDATE_TOPIC, + CONFIG_UPDATE_EVENT_VERSION_0, + B256::ZERO, + ], + hex!("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000babe0000beef").into() + ) + }; + + let system_log = SystemConfigLog::new(log, false); + let err = GasLimitUpdate::try_from(&system_log).unwrap_err(); + assert_eq!(err, GasLimitUpdateError::PointerDecodingError); + } + + #[test] + fn test_gas_limit_update_invalid_pointer_length() { + let log = Log { + address: Address::ZERO, + data: LogData::new_unchecked( + vec![ + CONFIG_UPDATE_TOPIC, + CONFIG_UPDATE_EVENT_VERSION_0, + B256::ZERO, + ], + hex!("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000babe0000beef").into() + ) + }; + + let system_log = SystemConfigLog::new(log, false); + let err = GasLimitUpdate::try_from(&system_log).unwrap_err(); + assert_eq!(err, GasLimitUpdateError::InvalidDataPointer(33)); + } + + #[test] + fn test_gas_limit_update_length_decoding_error() { + let log = Log { + address: Address::ZERO, + data: LogData::new_unchecked( + vec![ + CONFIG_UPDATE_TOPIC, + CONFIG_UPDATE_EVENT_VERSION_0, + B256::ZERO, + ], + hex!("0000000000000000000000000000000000000000000000000000000000000020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000babe0000beef").into() + ) + }; + + let system_log = SystemConfigLog::new(log, false); + let err = GasLimitUpdate::try_from(&system_log).unwrap_err(); + assert_eq!(err, GasLimitUpdateError::LengthDecodingError); + } + + #[test] + fn test_gas_limit_update_invalid_data_length() { + let log = Log { + address: Address::ZERO, + data: LogData::new_unchecked( + vec![ + CONFIG_UPDATE_TOPIC, + CONFIG_UPDATE_EVENT_VERSION_0, + B256::ZERO, + ], + hex!("000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000babe0000beef").into() + ) + }; + + let system_log = SystemConfigLog::new(log, false); + let err = GasLimitUpdate::try_from(&system_log).unwrap_err(); + assert_eq!(err, GasLimitUpdateError::InvalidDataLength(33)); + } + + #[test] + fn test_gas_limit_update_gas_limit_decoding_error() { + let log = Log { + address: Address::ZERO, + data: LogData::new_unchecked( + vec![ + CONFIG_UPDATE_TOPIC, + CONFIG_UPDATE_EVENT_VERSION_0, + B256::ZERO, + ], + hex!("00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF").into() + ) + }; + + let system_log = SystemConfigLog::new(log, false); + let err = GasLimitUpdate::try_from(&system_log).unwrap_err(); + assert_eq!(err, GasLimitUpdateError::GasLimitDecodingError); + } }