chiark / gitweb /
bus: send memfds as payload only on directed messages and for large parts
[elogind.git] / src / libsystemd-bus / bus-socket.c
index 4dafe1fdb7f52388e714b4ea249a0cc234b88407..befded70799e07d242acd30b0f13159924138e93 100644 (file)
@@ -72,7 +72,7 @@ static int append_iovec(sd_bus_message *m, const void *p, size_t sz) {
 
 static int bus_message_setup_iovec(sd_bus_message *m) {
         struct bus_body_part *part;
-        unsigned n;
+        unsigned n, i;
         int r;
 
         assert(m);
@@ -83,34 +83,38 @@ static int bus_message_setup_iovec(sd_bus_message *m) {
 
         assert(!m->iovec);
 
-        n = 1 + !!m->fields + m->n_body_parts;
+        n = 1 + m->n_body_parts;
         if (n < ELEMENTSOF(m->iovec_fixed))
                 m->iovec = m->iovec_fixed;
         else {
                 m->iovec = new(struct iovec, n);
-                if (!m->iovec)
-                        return -ENOMEM;
+                if (!m->iovec) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
         }
 
-        r = append_iovec(m, m->header, sizeof(*m->header));
+        r = append_iovec(m, m->header, BUS_MESSAGE_BODY_BEGIN(m));
         if (r < 0)
-                return r;
+                goto fail;
 
-        if (m->fields) {
-                r = append_iovec(m, m->fields, ALIGN8(m->header->fields_size));
+        MESSAGE_FOREACH_PART(part, i, m)  {
+                r = bus_body_part_map(part);
                 if (r < 0)
-                        return r;
-        }
+                        goto fail;
 
-        for (part = &m->body; part && part->size > 0; part = part->next) {
                 r = append_iovec(m, part->data, part->size);
                 if (r < 0)
-                        return r;
+                        goto fail;
         }
 
         assert(n == m->n_iovec);
 
         return 0;
+
+fail:
+        m->poisoned = true;
+        return r;
 }
 
 bool bus_socket_auth_needs_write(sd_bus *b) {