https://github.com/python/cpython/commit/3fe03ccea61121b05e933013f76aa02f690014c1
commit: 3fe03ccea61121b05e933013f76aa02f690014c1
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2024-04-16T20:34:12Z
summary:

gh-117755: Fix mimalloc for huge allocation on s390x (#117809)

Fix mimalloc allocator for huge memory allocation (around
8,589,934,592 GiB) on s390x.

Abort allocation early in mimalloc if the number of slices doesn't
fit into uint32_t, to prevent a integer overflow (cast 64-bit
size_t to uint32_t).

files:
A Misc/NEWS.d/next/Core and 
Builtins/2024-04-12-12-28-49.gh-issue-117755.6ct8kU.rst
M Objects/mimalloc/segment.c

diff --git a/Misc/NEWS.d/next/Core and 
Builtins/2024-04-12-12-28-49.gh-issue-117755.6ct8kU.rst b/Misc/NEWS.d/next/Core 
and Builtins/2024-04-12-12-28-49.gh-issue-117755.6ct8kU.rst
new file mode 100644
index 00000000000000..a65ec43e25d1c5
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and 
Builtins/2024-04-12-12-28-49.gh-issue-117755.6ct8kU.rst 
@@ -0,0 +1,2 @@
+Fix mimalloc allocator for huge memory allocation (around 8,589,934,592 GiB) on
+s390x. Patch by Victor Stinner.
diff --git a/Objects/mimalloc/segment.c b/Objects/mimalloc/segment.c
index 08b156433653a4..0b4d3abc07a93c 100644
--- a/Objects/mimalloc/segment.c
+++ b/Objects/mimalloc/segment.c
@@ -814,6 +814,9 @@ static mi_segment_t* mi_segment_os_alloc( size_t required, 
size_t page_alignment
     const size_t extra = align_offset - info_size;
     // recalculate due to potential guard pages
     *psegment_slices = mi_segment_calculate_slices(required + extra, 
ppre_size, pinfo_slices);
+
+    // mi_page_t.slice_count type is uint32_t
+    if (*psegment_slices > (size_t)UINT32_MAX) return NULL;
   }
 
   const size_t segment_size = (*psegment_slices) * MI_SEGMENT_SLICE_SIZE;
@@ -865,6 +868,9 @@ static mi_segment_t* mi_segment_alloc(size_t required, 
size_t page_alignment, mi
   size_t pre_size;
   size_t segment_slices = mi_segment_calculate_slices(required, &pre_size, 
&info_slices);
 
+  // mi_page_t.slice_count type is uint32_t
+  if (segment_slices > (size_t)UINT32_MAX) return NULL;
+
   // Commit eagerly only if not the first N lazy segments (to reduce impact of 
many threads that allocate just a little)
   const bool eager_delay = (// !_mi_os_has_overcommit() &&             // 
never delay on overcommit systems
                             _mi_current_thread_count() > 1 &&       // do not 
delay for the first N threads

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to