From 1a6bbd2867486828e4ebf0b3166685f6106f93df Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Wed, 8 Jul 2020 15:54:42 -0600 Subject: [PATCH] Limited Deserialize isn't limiting anything (#10952) * Add failing test * Use deserialize_from to enable limit --- core/src/rpc.rs | 2 +- perf/src/packet.rs | 2 +- sdk/src/program_utils.rs | 23 ++++++++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/core/src/rpc.rs b/core/src/rpc.rs index 21f4f4161..29b502d89 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -1690,7 +1690,7 @@ fn deserialize_bs58_transaction(bs58_transaction: String) -> Result<(Vec, Tr } bincode::config() .limit(PACKET_DATA_SIZE as u64) - .deserialize(&wire_transaction) + .deserialize_from(&wire_transaction[..]) .map_err(|err| { info!("transaction deserialize error: {:?}", err); Error::invalid_params(&err.to_string()) diff --git a/perf/src/packet.rs b/perf/src/packet.rs index d62e27478..8609838cc 100644 --- a/perf/src/packet.rs +++ b/perf/src/packet.rs @@ -102,7 +102,7 @@ where { bincode::config() .limit(PACKET_DATA_SIZE as u64) - .deserialize(data) + .deserialize_from(data) } #[cfg(test)] diff --git a/sdk/src/program_utils.rs b/sdk/src/program_utils.rs index 979a18bee..6f5f57e28 100644 --- a/sdk/src/program_utils.rs +++ b/sdk/src/program_utils.rs @@ -9,6 +9,27 @@ where let limit = crate::packet::PACKET_DATA_SIZE as u64; bincode::config() .limit(limit) - .deserialize(instruction_data) + .deserialize_from(instruction_data) .map_err(|_| InstructionError::InvalidInstructionData) } + +#[cfg(test)] +pub mod tests { + use super::*; + + #[test] + fn test_limited_deserialize() { + #[derive(Deserialize, Serialize)] + enum Foo { + Bar(Vec), + } + + let item = Foo::Bar([1; crate::packet::PACKET_DATA_SIZE - 12].to_vec()); // crate::packet::PACKET_DATA_SIZE - 12: size limit, minus enum variant and vec len() serialized sizes + let serialized = bincode::serialize(&item).unwrap(); + assert!(limited_deserialize::(&serialized).is_ok()); + + let item = Foo::Bar([1; crate::packet::PACKET_DATA_SIZE - 11].to_vec()); // Extra byte should bump serialized size over the size limit + let serialized = bincode::serialize(&item).unwrap(); + assert!(limited_deserialize::(&serialized).is_err()); + } +}