@@ -582,7 +582,17 @@ pub(super) mod serde_impl {
582582 let mut res = Vec :: with_capacity ( mem_cap) ;
583583
584584 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+
586596 res. extend_from_slice ( mem_addr. to_le_bytes ( ) . as_ref ( ) ) ;
587597 match value {
588598 // Serializes RelocatableValue(little endian):
@@ -939,6 +949,17 @@ mod test {
939949 ) ;
940950 }
941951
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+
942963 #[ rstest]
943964 #[ cfg( feature = "std" ) ]
944965 #[ case( include_bytes!( "../../../../cairo_programs/fibonacci.json" ) , "fibonacci" ) ]
0 commit comments