chiark / gitweb /
bus: send memfds as payload only on directed messages and for large parts
[elogind.git] / src / libsystemd-bus / bus-socket.c
index f43b7da05ca651fa158a07e850cf0531f4a840dc..befded70799e07d242acd30b0f13159924138e93 100644 (file)
@@ -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;
 
-        MESSAGE_FOREACH_PART(part, i, m)  {
                 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) {