From: Ivan Grokhotkov Date: Thu, 19 Oct 2017 13:30:26 +0000 (+0800) Subject: Merge branch 'bugfix/malloc_failure' into 'master' X-Git-Tag: v3.1-dev~152 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6cc809961033c9007a4250c8401c2c7e41c99d7b;p=esp-idf Merge branch 'bugfix/malloc_failure' into 'master' heap: Fix race condition causing malloc() to fail under some conditions See merge request !1424 --- 6cc809961033c9007a4250c8401c2c7e41c99d7b diff --cc components/heap/multi_heap.c index 98aa425015,cc621c0d88..93ae0c5f67 --- a/components/heap/multi_heap.c +++ b/components/heap/multi_heap.c @@@ -351,8 -341,18 +351,18 @@@ void *multi_heap_malloc_impl(multi_heap return NULL; } - MULTI_HEAP_LOCK(heap->lock); + multi_heap_internal_lock(heap); + /* Note: this check must be done while holding the lock as both + malloc & realloc may temporarily shrink the free_bytes value + before they split a large block. This can result in false negatives, + especially if the heap is unfragmented. + */ + if (heap->free_bytes < size) { + MULTI_HEAP_UNLOCK(heap->lock); + return NULL; + } + /* Find best free block to perform the allocation in */ prev = &heap->first_block; for (heap_block_t *b = heap->first_block.next_free; b != NULL; b = b->next_free) {