Merge pull request #303 from isanych/fix_access_violation

Fix rare access violation on out of memory
This commit is contained in:
Daan 2020-09-14 08:49:52 -07:00 committed by GitHub
commit ff7b6c54bd
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 3 deletions

View file

@ -297,9 +297,13 @@ static void* mi_region_try_alloc(size_t blocks, bool* commit, bool* is_large, bo
mi_bitmap_claim(&region->commit, 1, blocks, bit_idx, &any_uncommitted); mi_bitmap_claim(&region->commit, 1, blocks, bit_idx, &any_uncommitted);
if (any_uncommitted) { if (any_uncommitted) {
mi_assert_internal(!info.x.is_large); mi_assert_internal(!info.x.is_large);
bool commit_zero; bool commit_zero = false;
_mi_mem_commit(p, blocks * MI_SEGMENT_SIZE, &commit_zero, tld); bool ok = _mi_mem_commit(p, blocks * MI_SEGMENT_SIZE, &commit_zero, tld);
if (commit_zero) *is_zero = true; if (commit_zero) *is_zero = true;
if (!ok)
{
return NULL;
}
} }
} }
else { else {

View file

@ -208,7 +208,11 @@ static void mi_segment_protect(mi_segment_t* segment, bool protect, mi_os_tld_t*
uint8_t* start = (uint8_t*)segment + segment->segment_size - os_psize; uint8_t* start = (uint8_t*)segment + segment->segment_size - os_psize;
if (protect && !segment->mem_is_committed) { if (protect && !segment->mem_is_committed) {
// ensure secure page is committed // ensure secure page is committed
#if (MI_DEBUG>1)
bool ok =
#endif
_mi_mem_commit(start, os_psize, NULL, tld); _mi_mem_commit(start, os_psize, NULL, tld);
mi_assert_internal(ok);
} }
mi_segment_protect_range(start, os_psize, protect); mi_segment_protect_range(start, os_psize, protect);
} }
@ -606,8 +610,11 @@ static mi_segment_t* mi_segment_init(mi_segment_t* segment, size_t required, mi_
// ensure the initial info is committed // ensure the initial info is committed
if (segment->capacity < capacity) { if (segment->capacity < capacity) {
bool commit_zero = false; bool commit_zero = false;
_mi_mem_commit(segment, pre_size, &commit_zero, tld->os); bool ok = _mi_mem_commit(segment, pre_size, &commit_zero, tld->os);
if (commit_zero) is_zero = true; if (commit_zero) is_zero = true;
if (!ok) {
return NULL;
}
} }
} }
} }