From efb92f13617df6aeebd7d882d821d9020284dc1e Mon Sep 17 00:00:00 2001 From: dzmitry-lahoda Date: Wed, 22 Jan 2025 17:50:24 +0000 Subject: [PATCH] u32::MAX limit for borsh --- src/bounded_vec.rs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/bounded_vec.rs b/src/bounded_vec.rs index ffe4ca5..a1f9155 100644 --- a/src/bounded_vec.rs +++ b/src/bounded_vec.rs @@ -445,8 +445,41 @@ mod borsh_impl { use alloc::collections::btree_map::{BTreeMap, Entry}; use borsh::{BorshDeserialize, BorshSchema, BorshSerialize}; + // we panic of U is bigger then it should be + + impl super::BoundedVec + where + Self: BorshSerialize, + { + /// Internal const assert. + const fn __assert_borsh_ser_upper_limit_under_u32_max() { + assert!(U <= u32::MAX as usize) + } + } + + impl super::BoundedVec + where + Self: BorshDeserialize, + { + /// Internal const assert + const fn __assert_borsh_de_upper_limit_under_u32_max() { + assert!(U <= u32::MAX as usize) + } + } + + impl super::BoundedVec + where + Self: BorshSchema, + { + /// Internal const assert + const fn __assert_borsh_schema_upper_limit_under_u32_max() { + assert!(U <= u32::MAX as usize) + } + } + impl BorshSerialize for BoundedVec { fn serialize(&self, writer: &mut W) -> borsh::io::Result<()> { + Self::__assert_borsh_ser_upper_limit_under_u32_max(); if U <= u8::MAX as usize { (self.len() as u8).serialize(writer)?; } else if U <= u16::MAX as usize { @@ -470,6 +503,7 @@ mod borsh_impl { impl BorshDeserialize for BoundedVec { fn deserialize_reader(reader: &mut R) -> borsh::io::Result { + Self::__assert_borsh_de_upper_limit_under_u32_max(); let len = if U <= u8::MAX as usize { u8::deserialize_reader(reader)? as usize } else if U <= u16::MAX as usize { @@ -514,6 +548,7 @@ mod borsh_impl { fn add_definitions_recursively( definitions: &mut BTreeMap, ) { + Self::__assert_borsh_schema_upper_limit_under_u32_max(); use borsh::schema::Definition; let len_width = if U <= u8::MAX as usize { 1 @@ -556,7 +591,7 @@ mod borsh_impl { use super::*; #[test] #[allow(clippy::expect_used)] - fn enddec() { + fn encdec() { let data: BoundedVec = vec![1u8, 2].try_into().expect("borsh works"); let buf = &mut Vec::new(); data.serialize(buf).expect("borsh works");