[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] minios: xmalloc and realloc fixes



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1256805291 0
# Node ID e1fd971ec20ed1299fd7324e3a71305b7f129099
# Parent  c1f2b68b6dcaf6f04fbd92da29ab253d0de501dc
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 <James.Pendergrass@xxxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 extras/mini-os/lib/xmalloc.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

diff -r c1f2b68b6dca -r e1fd971ec20e extras/mini-os/lib/xmalloc.c
--- a/extras/mini-os/lib/xmalloc.c      Wed Oct 28 17:27:47 2009 +0000
+++ b/extras/mini-os/lib/xmalloc.c      Thu Oct 29 08:34:51 2009 +0000
@@ -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;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.