From b4078cbbf3354229fc81ecfd26295237d808caa9 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 14 Aug 2017 12:14:05 +1000 Subject: [PATCH] Revert "py/gc: Zero out all newly allocated memory to prevent stale pointers." This reverts commit 1c0343f9d991c241d335712593f3a63858dc91b6. Reason: to make merging simpler. This feature will anyway be provided by master in a later version. --- py/gc.c | 8 ++++---- py/malloc.c | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/py/gc.c b/py/gc.c index ca332860f5..a1ba45a2bf 100644 --- a/py/gc.c +++ b/py/gc.c @@ -409,12 +409,12 @@ found: void *ret_ptr = (void*)(MP_STATE_MEM(gc_pool_start) + start_block * BYTES_PER_BLOCK); DEBUG_printf("gc_alloc(%p)\n", ret_ptr); - // Zero out all the bytes of the newly allocated blocks. + // zero out the additional bytes of the newly allocated blocks // This is needed because the blocks may have previously held pointers // to the heap and will not be set to something else if the caller // doesn't actually use the entire block. As such they will continue // to point to the heap and may prevent other blocks from being reclaimed. - memset((byte*)ret_ptr, 0, (end_block - start_block + 1) * BYTES_PER_BLOCK); + memset((byte*)ret_ptr + n_bytes, 0, (end_block - start_block + 1) * BYTES_PER_BLOCK - n_bytes); #if MICROPY_ENABLE_FINALISER if (has_finaliser) { @@ -620,8 +620,8 @@ void *gc_realloc(void *ptr_in, size_t n_bytes, bool allow_move) { ATB_FREE_TO_TAIL(bl); } - // zero out the bytes of the newly allocated blocks (see comment above in gc_alloc) - memset((byte*)ptr_in + n_blocks * BYTES_PER_BLOCK, 0, (new_blocks - n_blocks) * BYTES_PER_BLOCK); + // zero out the additional bytes of the newly allocated blocks (see comment above in gc_alloc) + memset((byte*)ptr_in + n_bytes, 0, new_blocks * BYTES_PER_BLOCK - n_bytes); #if EXTENSIVE_HEAP_PROFILING gc_dump_alloc_table(); diff --git a/py/malloc.c b/py/malloc.c index c837ed5735..b0493d9341 100644 --- a/py/malloc.c +++ b/py/malloc.c @@ -114,7 +114,10 @@ void *m_malloc_with_finaliser(size_t num_bytes) { void *m_malloc0(size_t num_bytes) { void *ptr = m_malloc(num_bytes); - // memory is already cleared by gc_alloc + if (ptr == NULL && num_bytes != 0) { + return m_malloc_fail(num_bytes); + } + memset(ptr, 0, num_bytes); return ptr; }