[Libguestfs] [PATCH 10/11] ruby: do not try to malloc 0 elements in get_all_event_callbacks

Pino Toscano
Fri, 03 Mar 2017 14:33:04 -0000

In case there are no event handlers registered with the handle,
get_all_event_callbacks will count 0 elements, trying to malloc a buffer
of that size.  POSIX says that this can result in either a null pointer,
or an unusable pointer.  Since we assume a null pointer means failure,
then always add a null element at the end, so we do not rely on
implementation-defined behaviour of malloc.

The output parameter 'len_rtn' already keeps the number of valid items
in the returned array, so there are no behaviour changes for callers of
get_all_event_callbacks.
---
 ruby/ext/guestfs/handle.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/ruby/ext/guestfs/handle.c b/ruby/ext/guestfs/handle.c
index aa10825..0fa230c 100644
--- a/ruby/ext/guestfs/handle.c
+++ b/ruby/ext/guestfs/handle.c
@@ -385,7 +385,7 @@ get_all_event_callbacks (guestfs_h *g, size_t *len_rtn)
   }

   /* Copy them into the return array. */
-  r = malloc (sizeof (VALUE *) * (*len_rtn));
+  r = malloc (sizeof (VALUE *) * (*len_rtn + 1));
   if (r == NULL)
     rb_raise (rb_eNoMemError, "malloc: %m");

@@ -398,6 +398,7 @@ get_all_event_callbacks (guestfs_h *g, size_t *len_rtn)
     }
     root = guestfs_next_private (g, &key);
   }
+  r[i] = NULL;

   return r;
 }
--
2.9.3