From: Keir Fraser Date: Thu, 29 Oct 2009 08:34:51 +0000 (+0000) Subject: minios: xmalloc and realloc fixes X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f52018f998d02b6cdcf6b757e58ee1618d06f36f;p=people%2Fliuw%2Flibxenctrl-split%2Fmini-os.git 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 --- diff --git a/lib/xmalloc.c b/lib/xmalloc.c index 14fe796..c7d3fc1 100644 --- a/lib/xmalloc.c +++ b/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;