chiark / gitweb /
bus: allow reading empty arrays with sd_bus_message_read_array()
authorLennart Poettering <lennart@poettering.net>
Thu, 7 Nov 2013 17:40:06 +0000 (18:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 7 Nov 2013 17:40:06 +0000 (18:40 +0100)
src/libsystemd-bus/bus-message.c
src/libsystemd-bus/test-bus-marshal.c

index 3f9baca806d49f88d2df37f9f7f4ddacd07ecb40..428568dcc2b23d3539ceafc6ae69f2c9e4db8128 100644 (file)
@@ -3585,12 +3585,18 @@ _public_ int sd_bus_message_read_array(sd_bus_message *m,
         c = message_get_container(m);
         sz = BUS_MESSAGE_BSWAP32(m, *c->array_size);
 
-        r = message_peek_body(m, &m->rindex, align, sz, &p);
-        if (r < 0)
-                goto fail;
-        if (r == 0) {
-                r = -EBADMSG;
-                goto fail;
+        if (sz == 0)
+                /* Zero length array, let's return some aligned
+                 * pointer that is not NULL */
+                p = (uint8_t*) NULL + align;
+        else {
+                r = message_peek_body(m, &m->rindex, align, sz, &p);
+                if (r < 0)
+                        goto fail;
+                if (r == 0) {
+                        r = -EBADMSG;
+                        goto fail;
+                }
         }
 
         r = sd_bus_message_exit_container(m);
index 5e29a7b6a2ac4adeba8d1eced199961dd1fda038..8f36a71d4b5d9032508e5fc365298d2656b7795f 100644 (file)
@@ -92,6 +92,9 @@ int main(int argc, char *argv[]) {
         r = sd_bus_message_append_array(m, 'i', integer_array, sizeof(integer_array));
         assert_se(r >= 0);
 
+        r = sd_bus_message_append_array(m, 'u', NULL, 0);
+        assert_se(r >= 0);
+
         r = bus_message_seal(m, 4711);
         assert_se(r >= 0);
 
@@ -210,6 +213,10 @@ int main(int argc, char *argv[]) {
         assert_se(sz == sizeof(integer_array));
         assert_se(memcmp(integer_array, return_array, sz) == 0);
 
+        r = sd_bus_message_read_array(m, 'u', (const void**) &return_array, &sz);
+        assert_se(r > 0);
+        assert_se(sz == 0);
+
         r = sd_bus_message_peek_type(m, NULL, NULL);
         assert_se(r == 0);