]> Repositorios git - scryer-prolog.git/commitdiff
handle oob heap index calculation
authorSkgland <[email protected]>
Sun, 7 Dec 2025 20:45:13 +0000 (21:45 +0100)
committerBennet Bleßmann <[email protected]>
Sun, 7 Dec 2025 20:45:13 +0000 (21:45 +0100)
src/machine/heap.rs
src/macros.rs

index d9f1aa88c0624d35a08381c7bde077f2ed715f18..3d614ebbba657f1d1c61dd032588fcbabf8bc640 100644 (file)
@@ -623,7 +623,7 @@ impl Heap {
 
     pub fn reserve(&mut self, num_cells: usize) -> Result<HeapWriter<'_>, AllocError> {
         let section;
-        let len = heap_index!(num_cells);
+        let len = heap_index_checked!(num_cells).ok_or(AllocError)?;
 
         loop {
             unsafe {
index 4ac590ebe1bbd718e7074905277c30fc47d509e1..a5e16b8b607ee1bba4ffcc98afafe80ba799efa8 100644 (file)
@@ -470,16 +470,22 @@ macro_rules! resource_error_call_result {
     };
 }
 
+macro_rules! heap_index_checked {
+    ($idx:expr) => {
+        std::mem::size_of::<HeapCellValue>().checked_mul($idx)
+    };
+}
+
+pub(crate) use heap_index_checked;
+
 macro_rules! heap_index {
     ($idx:expr) => {{
         let idx = $idx;
-        std::mem::size_of::<HeapCellValue>()
-            .checked_mul(idx)
-            .expect(&format!(
-                "overflow while calculating heap index {idx} * {} > {}",
-                std::mem::size_of::<HeapCellValue>(),
-                usize::MAX,
-            ))
+        $crate::macros::heap_index_checked!(idx).expect(&format!(
+            "overflow while calculating heap index {idx} * {} > {}",
+            std::mem::size_of::<HeapCellValue>(),
+            usize::MAX,
+        ))
     }};
 }