summaryrefslogtreecommitdiff
path: root/innobase/include/mem0mem.ic
diff options
context:
space:
mode:
authorunknown <marko@hundin.mysql.fi>2004-06-16 17:22:35 +0300
committerunknown <marko@hundin.mysql.fi>2004-06-16 17:22:35 +0300
commita09ecb2504de0f9d74521039c86e4e4412d0dfa7 (patch)
treea2763282ee8c6d10649ffad61d857075e8ea415d /innobase/include/mem0mem.ic
parentd587a36aa131b74d75da6d456ce297f8f8c893e3 (diff)
downloadmariadb-git-a09ecb2504de0f9d74521039c86e4e4412d0dfa7.tar.gz
InnoDB bug fix: mem_realloc() didn't preserve the block contents
innobase/include/mem0mem.ic: mem_realloc(): preserve the old buffer contents
Diffstat (limited to 'innobase/include/mem0mem.ic')
-rw-r--r--innobase/include/mem0mem.ic18
1 files changed, 15 insertions, 3 deletions
diff --git a/innobase/include/mem0mem.ic b/innobase/include/mem0mem.ic
index c250e6948ec..a51de5a5cf0 100644
--- a/innobase/include/mem0mem.ic
+++ b/innobase/include/mem0mem.ic
@@ -575,9 +575,21 @@ mem_realloc(
char* file_name,/* in: file name where called */
ulint line) /* in: line where called */
{
- mem_free(buf);
-
- return(mem_alloc_func(n, file_name, line));
+ mem_heap_t* heap = (mem_heap_t*)((byte*)buf
+ - MEM_BLOCK_HEADER_SIZE - MEM_FIELD_HEADER_SIZE);
+ ulint size;
+ ut_a(heap->magic_n == MEM_BLOCK_MAGIC_N);
+ size = mem_block_get_len(heap);
+ ut_a(size > MEM_BLOCK_HEADER_SIZE + MEM_FIELD_HEADER_SIZE);
+ size -= MEM_BLOCK_HEADER_SIZE + MEM_FIELD_HEADER_SIZE;
+
+ if (n > size) {
+ void* newbuf = memcpy(mem_alloc_func(n, file_name, line),
+ buf, size);
+ mem_free(buf);
+ buf = newbuf;
+ }
+ return(buf);
}
/**************************************************************************