chiark / gitweb /
bus: allow reading empty arrays with sd_bus_message_read_array()
[elogind.git] / src / libsystemd-bus / bus-message.c
index 9543ae3b26acc6df0bc3a843c08f96cc68a24aec..428568dcc2b23d3539ceafc6ae69f2c9e4db8128 100644 (file)
@@ -1323,7 +1323,6 @@ int message_append_basic(sd_bus_message *m, char type, const void *p, const void
         int r;
 
         assert_return(m, -EINVAL);
-        assert_return(p, -EINVAL);
         assert_return(!m->sealed, -EPERM);
         assert_return(bus_type_is_basic(type), -EINVAL);
         assert_return(!m->poisoned, -ESTALE);
@@ -1380,6 +1379,12 @@ int message_append_basic(sd_bus_message *m, char type, const void *p, const void
                 break;
 
         case SD_BUS_TYPE_BOOLEAN:
+
+                if (!p) {
+                        r = -EINVAL;
+                        goto fail;
+                }
+
                 align = sz = 4;
 
                 assert_cc(sizeof(int) == sizeof(uint32_t));
@@ -1391,6 +1396,11 @@ int message_append_basic(sd_bus_message *m, char type, const void *p, const void
         case SD_BUS_TYPE_UNIX_FD: {
                 int z, *f;
 
+                if (!p) {
+                        r = -EINVAL;
+                        goto fail;
+                }
+
                 if (!m->allow_fds) {
                         r = -ENOTSUP;
                         goto fail;
@@ -1425,6 +1435,11 @@ int message_append_basic(sd_bus_message *m, char type, const void *p, const void
         }
 
         default:
+                if (!p) {
+                        r = -EINVAL;
+                        goto fail;
+                }
+
                 align = bus_type_get_alignment(type);
                 sz = bus_type_get_size(type);
                 break;
@@ -3570,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);