mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-08 00:09:31 +03:00
fix assertions for huge pages in secure mode
This commit is contained in:
parent
b8846f7a27
commit
66e5484c1c
2 changed files with 8 additions and 4 deletions
|
@ -157,7 +157,7 @@ static void* mi_cache_pop(int numa_node, size_t size, size_t alignment, bool* co
|
||||||
}
|
}
|
||||||
|
|
||||||
// find an available slot
|
// find an available slot
|
||||||
mi_bitmap_index_t bitidx;
|
mi_bitmap_index_t bitidx = 0;
|
||||||
bool claimed = false;
|
bool claimed = false;
|
||||||
if (*large) { // large allowed?
|
if (*large) { // large allowed?
|
||||||
claimed = mi_bitmap_try_find_from_claim(cache_available_large, MI_CACHE_FIELDS, start_field, 1, &bitidx);
|
claimed = mi_bitmap_try_find_from_claim(cache_available_large, MI_CACHE_FIELDS, start_field, 1, &bitidx);
|
||||||
|
|
|
@ -164,10 +164,12 @@ static bool mi_segment_is_valid(mi_segment_t* segment, mi_segments_tld_t* tld) {
|
||||||
}
|
}
|
||||||
else { // free range of slices; only last slice needs a valid back offset
|
else { // free range of slices; only last slice needs a valid back offset
|
||||||
mi_slice_t* last = &segment->slices[maxindex];
|
mi_slice_t* last = &segment->slices[maxindex];
|
||||||
mi_assert_internal((uint8_t*)slice == (uint8_t*)last - last->slice_offset);
|
if (segment->kind != MI_SEGMENT_HUGE || slice->slice_count <= segment->slice_entries) {
|
||||||
|
mi_assert_internal((uint8_t*)slice == (uint8_t*)last - last->slice_offset);
|
||||||
|
}
|
||||||
mi_assert_internal(slice == last || last->slice_count == 0 );
|
mi_assert_internal(slice == last || last->slice_count == 0 );
|
||||||
mi_assert_internal(last->xblock_size == 0 || (segment->kind==MI_SEGMENT_HUGE && last->xblock_size==1));
|
mi_assert_internal(last->xblock_size == 0 || (segment->kind==MI_SEGMENT_HUGE && last->xblock_size==1));
|
||||||
if (segment->kind != MI_SEGMENT_HUGE && segment->thread_id != 0) { // segment is not huge or abandonded
|
if (segment->kind != MI_SEGMENT_HUGE && segment->thread_id != 0) { // segment is not huge or abandoned
|
||||||
sq = mi_span_queue_for(slice->slice_count,tld);
|
sq = mi_span_queue_for(slice->slice_count,tld);
|
||||||
mi_assert_internal(mi_span_queue_contains(sq,slice));
|
mi_assert_internal(mi_span_queue_contains(sq,slice));
|
||||||
}
|
}
|
||||||
|
@ -713,6 +715,7 @@ static mi_segment_t* mi_segment_init(mi_segment_t* segment, size_t required, mi_
|
||||||
_mi_stat_increase(&tld->stats->page_committed, mi_segment_info_size(segment));
|
_mi_stat_increase(&tld->stats->page_committed, mi_segment_info_size(segment));
|
||||||
|
|
||||||
// set up guard pages
|
// set up guard pages
|
||||||
|
size_t guard_slices = 0;
|
||||||
if (MI_SECURE>0) {
|
if (MI_SECURE>0) {
|
||||||
// in secure mode, we set up a protected page in between the segment info
|
// in secure mode, we set up a protected page in between the segment info
|
||||||
// and the page data
|
// and the page data
|
||||||
|
@ -723,6 +726,7 @@ static mi_segment_t* mi_segment_init(mi_segment_t* segment, size_t required, mi_
|
||||||
mi_segment_ensure_committed(segment, end, os_page_size, tld->stats);
|
mi_segment_ensure_committed(segment, end, os_page_size, tld->stats);
|
||||||
_mi_os_protect(end, os_page_size);
|
_mi_os_protect(end, os_page_size);
|
||||||
if (slice_entries == segment_slices) segment->slice_entries--; // don't use the last slice :-(
|
if (slice_entries == segment_slices) segment->slice_entries--; // don't use the last slice :-(
|
||||||
|
guard_slices = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// reserve first slices for segment info
|
// reserve first slices for segment info
|
||||||
|
@ -737,7 +741,7 @@ static mi_segment_t* mi_segment_init(mi_segment_t* segment, size_t required, mi_
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mi_assert_internal(huge_page!=NULL);
|
mi_assert_internal(huge_page!=NULL);
|
||||||
*huge_page = mi_segment_span_allocate(segment, info_slices, segment_slices - info_slices, tld);
|
*huge_page = mi_segment_span_allocate(segment, info_slices, segment_slices - info_slices - guard_slices, tld);
|
||||||
}
|
}
|
||||||
|
|
||||||
mi_assert_expensive(mi_segment_is_valid(segment,tld));
|
mi_assert_expensive(mi_segment_is_valid(segment,tld));
|
||||||
|
|
Loading…
Add table
Reference in a new issue