diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-08-11 16:16:09 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-08-11 16:16:09 +0400 |
commit | 51182bc78d993126645b20e38349760f1a697966 (patch) | |
tree | 5db559750d44990fe982e57c32036621920a180e | |
parent | 0682c3f1aefe315df5fe64ba8c814adacbd739e5 (diff) |
add MEM_recallocN(), so bytes are ensured to be zero'd when growing.
-rw-r--r-- | intern/guardedalloc/MEM_guardedalloc.h | 10 | ||||
-rw-r--r-- | intern/guardedalloc/intern/mallocn.c | 39 | ||||
-rw-r--r-- | source/blender/avi/intern/avi.c | 4 |
3 files changed, 48 insertions, 5 deletions
diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h index ae8115a337e..149483e719f 100644 --- a/intern/guardedalloc/MEM_guardedalloc.h +++ b/intern/guardedalloc/MEM_guardedalloc.h @@ -111,6 +111,16 @@ extern "C" { ; /** + * A variant of realloc which zeros new bytes + */ + void *MEM_recallocN(void *vmemh, size_t len) +#if MEM_GNU_ATTRIBUTES + __attribute__((warn_unused_result)) + __attribute__((alloc_size(2))) +#endif + ; + + /** * Allocate a block of memory of size len, with tag name str. The * memory is cleared. The name must be static, because only a * pointer to it is stored ! */ diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index c4902e6aa5a..df6f4d59c7f 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -302,10 +302,45 @@ void *MEM_reallocN(void *vmemh, size_t len) newp = MEM_mallocN(len, memh->name); if (newp) { - if (len < memh->len) + if (len < memh->len) { + /* shrink */ memcpy(newp, vmemh, len); - else + } + else { + /* grow (or remain same size) */ + memcpy(newp, vmemh, memh->len); + } + } + + MEM_freeN(vmemh); + } + + return newp; +} + +void *MEM_recallocN(void *vmemh, size_t len) +{ + void *newp = NULL; + + if (vmemh) { + MemHead *memh = vmemh; + memh--; + + newp = MEM_mallocN(len, memh->name); + if (newp) { + if (len < memh->len) { + /* shrink */ + memcpy(newp, vmemh, len); + } + else { memcpy(newp, vmemh, memh->len); + + if (len > memh->len) { + /* grow */ + /* zero new bytes */ + memset(((char *)newp) + memh->len, 0, len - memh->len); + } + } } MEM_freeN(vmemh); diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 9d4704cf0f2..39424057faf 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -968,9 +968,7 @@ AviError AVI_write_frame(AviMovie *movie, int frame_num, ...) const size_t entry_size = (movie->header->Streams + 1) * sizeof(AviIndexEntry); if (movie->entries != NULL) { - temp = (AviIndexEntry *)MEM_reallocN(movie->entries, (frame_num + 1) * entry_size); - /* clear new bytes */ - memset(&temp[movie->index_entries + 1], 0, (frame_num - movie->index_entries) * entry_size); + temp = (AviIndexEntry *)MEM_recallocN(movie->entries, (frame_num + 1) * entry_size); } else { temp = (AviIndexEntry *) MEM_callocN((frame_num + 1) * entry_size, "newidxentry"); |