if (!part->sealed)
bus_kernel_push_memfd(m->bus, part->memfd, part->data, part->mapped);
else {
- if (part->size > 0)
- assert_se(munmap(part->data, PAGE_ALIGN(part->size)) == 0);
+ if (part->mapped > 0)
+ assert_se(munmap(part->data, part->mapped) == 0);
close_nointr_nofail(part->memfd);
}
if (m->free_kdbus)
free(m->kdbus);
- if (m->release_kdbus)
- ioctl(m->bus->input_fd, KDBUS_CMD_MSG_RELEASE, m->kdbus);
+ if (m->release_kdbus) {
+ uint64_t off;
- if (m->free_fds) {
- close_many(m->fds, m->n_fds);
- free(m->fds);
+ off = (uint8_t *)m->kdbus - (uint8_t *)m->bus->kdbus_buffer;
+ ioctl(m->bus->input_fd, KDBUS_CMD_MSG_RELEASE, &off);
}
if (m->bus)
sd_bus_unref(m->bus);
+ if (m->free_fds) {
+ close_many(m->fds, m->n_fds);
+ free(m->fds);
+ }
+
if (m->iovec != m->iovec_fixed)
free(m->iovec);
goto fail;
if (call->sender) {
- r = message_append_field_string(t, SD_BUS_MESSAGE_HEADER_DESTINATION, SD_BUS_TYPE_STRING, call->sender, &t->sender);
+ r = message_append_field_string(t, SD_BUS_MESSAGE_HEADER_DESTINATION, SD_BUS_TYPE_STRING, call->sender, &t->destination);
if (r < 0)
goto fail;
}
part->mapped = psz;
part->data = n;
- part->munmap_this = true;
}
+
+ part->munmap_this = true;
} else {
n = realloc(part->data, sz);
if (!n) {
for (c = m->containers; c < m->containers + m->n_containers; c++)
if (c->array_size)
*c->array_size += expand;
-
}
static void *message_extend_body(sd_bus_message *m, size_t align, size_t sz) {
/* If this is something we can send as memfd, then let's seal
the memfd now. Note that we can send memfds as payload only
for directed messages, and not for broadcasts. */
- if (m->destination) {
+ if (m->destination && m->bus && m->bus->use_memfd) {
MESSAGE_FOREACH_PART(part, i, m)
- if (part->memfd >= 0 && !part->sealed && part->size > MEMFD_MIN_SIZE) {
+ if (part->memfd >= 0 && !part->sealed && (part->size > MEMFD_MIN_SIZE || m->bus->use_memfd < 0)) {
bus_body_part_unmap(part);
if (ioctl(part->memfd, KDBUS_CMD_MEMFD_SEAL_SET, 1) >= 0)