From 9b3f4ef6eec6a5981dcaa62f45da49b8f4f95388 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 24 Jan 2017 16:52:00 +1030 Subject: [PATCH] tal: make tal_len/tal_count(NULL) return 0. Previously it crashed, but if you're always dealing with tal arrays, this is painful. Signed-off-by: Rusty Russell --- ccan/tal/tal.c | 3 +++ ccan/tal/tal.h | 10 +++++----- ccan/tal/test/run-count.c | 6 +++++- tools/depends.c | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ccan/tal/tal.c b/ccan/tal/tal.c index 2a2eca77..555dd133 100644 --- a/ccan/tal/tal.c +++ b/ccan/tal/tal.c @@ -654,6 +654,9 @@ size_t tal_len(const tal_t *ptr) { struct length *l; + if (!ptr) + return 0; + l = find_property(debug_tal(to_tal_hdr(ptr)), LENGTH); if (!l) return 0; diff --git a/ccan/tal/tal.h b/ccan/tal/tal.h index 200c2b16..e525a01d 100644 --- a/ccan/tal/tal.h +++ b/ccan/tal/tal.h @@ -304,18 +304,18 @@ const char *tal_name(const tal_t *ptr); /** * tal_count - get the count of objects in a tal_arr. - * @ptr: The tal allocated object array. + * @ptr: The tal allocated object array (or NULL) * - * Returns 0 if @ptr has no length property, but be aware that that is - * also a valid size! + * Returns 0 if @ptr has no length property or is NULL, but be aware + * that that is also a valid size! */ #define tal_count(p) (tal_len(p) / sizeof(*p)) /** * tal_len - get the count of bytes in a tal_arr. - * @ptr: The tal allocated object array. + * @ptr: The tal allocated object array (or NULL) * - * Returns 0 if @ptr has no length property, but be aware that that is + * Returns 0 if @ptr has no length property or NULL, but be aware that that is * also a valid size! */ size_t tal_len(const tal_t *ptr); diff --git a/ccan/tal/test/run-count.c b/ccan/tal/test/run-count.c index 6a4eb4ab..33049b9f 100644 --- a/ccan/tal/test/run-count.c +++ b/ccan/tal/test/run-count.c @@ -43,7 +43,11 @@ int main(void) tal_set_backend(my_alloc, my_realloc, my_free, NULL); - plan_tests(19 * 3); + plan_tests(2 + 19 * 3); + + p1 = NULL; + ok1(tal_len(p1) == 0); + ok1(tal_count(p1) == 0); for (i = 0; i < 3; i++) { move = i; diff --git a/tools/depends.c b/tools/depends.c index 95bda1b5..e6a79d71 100644 --- a/tools/depends.c +++ b/tools/depends.c @@ -306,7 +306,7 @@ static char *get_one_ported(const void *ctx, const char *dir, char **ported = get_one_prop(ctx, dir, "ported", get_info); /* No news is good news. */ - if (!ported || tal_count(ported) == 0) + if (tal_count(ported) == 0) return NULL; if (tal_count(ported) != 1) -- 2.39.2