diff options
Diffstat (limited to 'intern/guardedalloc/intern')
-rw-r--r-- | intern/guardedalloc/intern/mallocn.c | 39 |
1 files changed, 37 insertions, 2 deletions
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); |