From 6293d958a4e12269261a7b68441b1c5be71d1f02 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 14 Oct 2020 16:35:55 +0200 Subject: [PATCH 1/2] sd-bus: initialize return values on success in sd_bus_message_read_array() Fixes: #17346 --- src/libsystemd/sd-bus/bus-message.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index 55e35cd902e..f966dda2294 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -4795,8 +4795,13 @@ _public_ int sd_bus_message_read_array( assert_return(!BUS_MESSAGE_NEED_BSWAP(m), -EOPNOTSUPP); r = sd_bus_message_enter_container(m, SD_BUS_TYPE_ARRAY, CHAR_TO_STR(type)); - if (r <= 0) + if (r < 0) return r; + if (r == 0) { + *ptr = NULL; + *size = 0; + return 0; + } c = message_get_last_container(m); From 4840807c6ddd15f093eea32acc6bb93ffac67dfe Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 14 Oct 2020 17:08:26 +0200 Subject: [PATCH 2/2] man: update sd_bus_message_read_array() docs to clarify return value 0 vs. 1 --- man/sd_bus_message_read_array.xml | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/man/sd_bus_message_read_array.xml b/man/sd_bus_message_read_array.xml index 7f9f9703b63..9bac0246c84 100644 --- a/man/sd_bus_message_read_array.xml +++ b/man/sd_bus_message_read_array.xml @@ -38,16 +38,16 @@ Description - sd_bus_message_read_array() gives access to an element array in - message m. The "read pointer" in the message must be right before an - array of type type. As a special case, type may be - NUL, in which case any type is acceptable. A pointer to the array data is - returned in the parameter ptr and the size of array data (in bytes) is - returned in the parameter size. If size is 0, a - valid non-null pointer will be returned, but it may not be dereferenced. The data is aligned as - appropriate for the data type. The data is part of the message — it may not be modified and is - valid only as long as the message is referenced. After this function returns, the "read pointer" - points at the next element after the array. + sd_bus_message_read_array() provides access to an array elements in the + bus message m. The "read pointer" in the message must be right before an array of type + type. As a special case, type may be + NUL, in which case any trivial type is acceptable. A pointer to the array data is returned + in the parameter ptr and the size of array data (in bytes) is returned in the + parameter size. If the returned size parameter is 0, a + valid non-null pointer will be returned as ptr, but it may not be + dereferenced. The data is aligned as appropriate for the data type. The data is part of the message — it + may not be modified and is valid only as long as the message is referenced. After this function returns, + the "read pointer" points at the next element after the array. Note that this function only supports arrays of trivial types, i.e. arrays of booleans, the various integer types, as well as floating point numbers. In particular it may not be used for arrays of strings, @@ -58,9 +58,12 @@ Return Value - On success, sd_bus_message_read_array() returns 0 or - a positive integer. On failure, it returns a negative errno-style error - code. + On success and when an array was read, sd_bus_message_read_array() returns an + integer greater than zero. If invoked while inside a container element (such as an array, e.g. when + operating on an array of arrays) and the final element of the outer container has been read already and + the read pointer is thus behind the last element of the outer container this call returns 0 (and the + returned pointer will be NULL and the size will be 0). On failure, it returns a + negative errno-style error code.