@@ -582,7 +582,17 @@ pub(super) mod serde_impl {
582
582
let mut res = Vec :: with_capacity ( mem_cap) ;
583
583
584
584
for ( ( segment, offset) , value) in values. iter ( ) {
585
- let mem_addr = ADDR_BASE + * segment as u64 * OFFSET_BASE + * offset as u64 ;
585
+ // mem_addr = ADDR_BASE + segment * OFFSET_BASE + offset
586
+ let mem_addr = ( * segment as u64 )
587
+ . checked_mul ( OFFSET_BASE )
588
+ . and_then ( |n| n. checked_add ( ADDR_BASE ) )
589
+ . and_then ( |n| n. checked_add ( * offset as u64 ) )
590
+ . ok_or_else ( || {
591
+ serde:: ser:: Error :: custom ( format ! (
592
+ "failed to serialize address: {segment}:{offset}"
593
+ ) )
594
+ } ) ?;
595
+
586
596
res. extend_from_slice ( mem_addr. to_le_bytes ( ) . as_ref ( ) ) ;
587
597
match value {
588
598
// Serializes RelocatableValue(little endian):
@@ -939,6 +949,17 @@ mod test {
939
949
) ;
940
950
}
941
951
952
+ #[ test]
953
+ fn serialize_cairo_pie_memory_with_overflow ( ) {
954
+ let memory = CairoPieMemory ( vec ! [
955
+ ( ( 0 , 0 ) , MaybeRelocatable :: Int ( 0 . into( ) ) ) ,
956
+ ( ( 0 , 1 ) , MaybeRelocatable :: Int ( 1 . into( ) ) ) ,
957
+ ( ( usize :: MAX , 0 ) , MaybeRelocatable :: Int ( 2 . into( ) ) ) ,
958
+ ] ) ;
959
+
960
+ serde_json:: to_value ( memory) . unwrap_err ( ) ;
961
+ }
962
+
942
963
#[ rstest]
943
964
#[ cfg( feature = "std" ) ]
944
965
#[ case( include_bytes!( "../../../../cairo_programs/fibonacci.json" ) , "fibonacci" ) ]
0 commit comments