solana_sdk/
program_utils.rs

1//! Contains a single utility function for deserializing from [bincode].
2//!
3//! [bincode]: https://docs.rs/bincode
4
5use crate::instruction::InstructionError;
6
7/// Deserialize with a limit based the maximum amount of data a program can expect to get.
8/// This function should be used in place of direct deserialization to help prevent OOM errors
9pub fn limited_deserialize<T>(instruction_data: &[u8]) -> Result<T, InstructionError>
10where
11    T: serde::de::DeserializeOwned,
12{
13    solana_program::program_utils::limited_deserialize(
14        instruction_data,
15        crate::packet::PACKET_DATA_SIZE as u64,
16    )
17}
18
19#[cfg(test)]
20pub mod tests {
21    use super::*;
22
23    #[test]
24    fn test_limited_deserialize() {
25        #[derive(Deserialize, Serialize)]
26        enum Foo {
27            Bar(Vec<u8>),
28        }
29
30        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
31        let serialized = bincode::serialize(&item).unwrap();
32        assert!(limited_deserialize::<Foo>(&serialized).is_ok());
33
34        let item = Foo::Bar([1; crate::packet::PACKET_DATA_SIZE - 11].to_vec()); // Extra byte should bump serialized size over the size limit
35        let serialized = bincode::serialize(&item).unwrap();
36        assert!(limited_deserialize::<Foo>(&serialized).is_err());
37    }
38}