X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-socket.c;h=befded70799e07d242acd30b0f13159924138e93;hb=d5a2b9a6f455468a0f29483303657ab4fd7013d8;hp=4dafe1fdb7f52388e714b4ea249a0cc234b88407;hpb=bc7fd8cdbef54ebd3902cdd455ecad3e095f7450;p=elogind.git diff --git a/src/libsystemd-bus/bus-socket.c b/src/libsystemd-bus/bus-socket.c index 4dafe1fdb..befded707 100644 --- a/src/libsystemd-bus/bus-socket.c +++ b/src/libsystemd-bus/bus-socket.c @@ -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) {