1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use {crate::instruction::InstructionError, bincode::config::Options};
pub fn limited_deserialize<T>(instruction_data: &[u8], limit: u64) -> Result<T, InstructionError>
where
    T: serde::de::DeserializeOwned,
{
    bincode::options()
        .with_limit(limit)
        .with_fixint_encoding() 
        .allow_trailing_bytes() 
        .deserialize_from(instruction_data)
        .map_err(|_| InstructionError::InvalidInstructionData)
}
#[cfg(test)]
pub mod tests {
    use {super::*, solana_program::system_instruction::SystemInstruction};
    #[test]
    fn test_limited_deserialize_advance_nonce_account() {
        let item = SystemInstruction::AdvanceNonceAccount;
        let serialized = bincode::serialize(&item).unwrap();
        assert_eq!(
            serialized.len(),
            4,
            "`SanitizedMessage::get_durable_nonce()` may need a change"
        );
        assert_eq!(
            limited_deserialize::<SystemInstruction>(&serialized, 4).as_ref(),
            Ok(&item)
        );
        assert!(limited_deserialize::<SystemInstruction>(&serialized, 3).is_err());
    }
}