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

Jim Meyering jim at meyering.net
Thu Jun 19 09:18:57 UTC 2008

Chris Lalancette <clalance at redhat.com> wrote:
>      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.

Wow.  That's a nasty one, violating such assumptions.
Good catch.

In case anyone reading along wonders about the portability of libvirt's
assumption that those functions return non-NULL for N=0, it's fine
because gnulib wrappers protect us from libc functions with the
undesirable semantics.


More information about the libvir-list mailing list