[libvirt] [PATCH]: Fix VIR_ALLOC_N for 0 byte arrays

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

 



Hello,
     For 0.4.3, danpb's new memory management scheme went into libvirt.  This is
fine, except that is subtly alters the semantics of malloc(), calloc(), and
realloc().  In particular, if you say:

foo = malloc(0);

glibc will happily return a non-NULL pointer to you.  However, with the new
memory management stuff, if you say:

foo = VIR_ALLOC(0);

you will actually get a NULL pointer back.  Personally, I think this is a
dangerous deviation from malloc() semantics that everyone is used to, and is
indeed causing problems with the remote driver.  The short of it is that the
remote driver allocates memory on behalf of the remote side using VIR_ALLOC_N,
and this call is returning NULL so that the NULL checks elsewhere in the code
fire and return failure.

The attached patch fixes this situation by removing the 0 checks from the memory
allocation paths, and just lets them fall through to the normal malloc(),
calloc(), or realloc() routines, restoring old semantics.

Signed-off-by: Chris Lalancette <clalance@xxxxxxxxxx>
Index: src/memory.c
===================================================================
RCS file: /data/cvs/libvirt/src/memory.c,v
retrieving revision 1.7
diff -u -r1.7 memory.c
--- a/src/memory.c	6 Jun 2008 11:09:57 -0000	1.7
+++ b/src/memory.c	19 Jun 2008 08:44:01 -0000
@@ -97,11 +97,6 @@
     }
 #endif
 
-    if (size == 0) {
-        *(void **)ptrptr = NULL;
-        return 0;
-    }
-
     *(void **)ptrptr = calloc(1, size);
     if (*(void **)ptrptr == NULL)
         return -1;
@@ -130,11 +125,6 @@
     }
 #endif
 
-    if (size == 0 || count == 0) {
-        *(void **)ptrptr = NULL;
-        return 0;
-    }
-
     *(void**)ptrptr = calloc(count, size);
     if (*(void**)ptrptr == NULL)
         return -1;
@@ -163,11 +153,6 @@
         return -1;
 #endif
 
-    if (size == 0 || count == 0) {
-        free(*(void **)ptrptr);
-        *(void **)ptrptr = NULL;
-        return 0;
-    }
     if (xalloc_oversized(count, size)) {
         errno = ENOMEM;
         return -1;
--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]