From 4e69eb152ebb1f81b539eb4c1decb372ad29242b Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 29 Oct 2009 08:34:51 +0000 Subject: minios: xmalloc and realloc fixes - xmalloc currently faults if xmalloc_new_page fails due to OOM - realloc treats xmalloc_hdr.size as the size of just the data region rather than the total size of data region + headers + padding. From: James Pendergrass Signed-off-by: Keir Fraser --- extras/mini-os/lib/xmalloc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'extras') diff --git a/extras/mini-os/lib/xmalloc.c b/extras/mini-os/lib/xmalloc.c index 14fe796131..c7d3fc1b30 100644 --- a/extras/mini-os/lib/xmalloc.c +++ b/extras/mini-os/lib/xmalloc.c @@ -187,6 +187,8 @@ void *_xmalloc(size_t size, size_t align) /* Alloc a new page and return from that. */ hdr = xmalloc_new_page(align_up(hdr_size, align) + size); + if ( hdr == NULL ) + return NULL; data_begin = (uintptr_t)hdr + align_up(hdr_size, align); } @@ -279,14 +281,18 @@ void *_realloc(void *ptr, size_t size) void *new; struct xmalloc_hdr *hdr; struct xmalloc_pad *pad; + size_t old_data_size; if (ptr == NULL) return _xmalloc(size, DEFAULT_ALIGN); pad = (struct xmalloc_pad *)ptr - 1; hdr = (struct xmalloc_hdr *)((char*)ptr - pad->hdr_size); - if (hdr->size >= size) { - maybe_split(hdr, size, hdr->size); + + old_data_size = hdr->size - pad->hdr_size; + if ( old_data_size >= size ) + { + maybe_split(hdr, pad->hdr_size + size, hdr->size); return ptr; } @@ -294,7 +300,7 @@ void *_realloc(void *ptr, size_t size) if (new == NULL) return NULL; - memcpy(new, ptr, hdr->size); + memcpy(new, ptr, old_data_size); xfree(ptr); return new; -- cgit v1.2.3