Skip to content

Commit ed94d8c

Browse files
Check overflow in cairo pie address calculation (#1945)
* Add check to cairo pie address calculation * Update CHANGELOG.md * Improve error message * Add unit test
1 parent 4505c25 commit ed94d8c

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#### Upcoming Changes
44

5+
* fix: Check overflow in cairo pie address calculation [#1945](https://github.com/lambdaclass/cairo-vm/pull/1945)
6+
57
#### [2.0.0-rc5] - 2025-02-24
68

79
* fix: Fix Cairo Pie limiting the number of segments to 2^16 [#1960](https://github.com/lambdaclass/cairo-vm/pull/1960)

vm/src/vm/runners/cairo_pie.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)