solana_sdk/
program_utils.rs

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