chiark / gitweb /
bus: fix memfd-cache regarding memfd offsets
authorDavid Herrmann <dh.herrmann@gmail.com>
Thu, 11 Dec 2014 09:44:41 +0000 (10:44 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Thu, 11 Dec 2014 09:44:41 +0000 (10:44 +0100)
We must restore part->mmap_begin when poping memfds from the memfd-cache.
We rely on the memfds to be unsealed, so we can be sure that we own the
whole FD. Therefore, simply set part->mmap_begin to the same as
part->data.

This fixes test-bus-kernel-benchmark.

src/libsystemd/sd-bus/bus-message.c

index 06d8d770fdba6e0f8d4b86064c6408b8cd495b92..0803999e070fc81e24dcd072b6ec53e7a674e4f9 100644 (file)
@@ -65,9 +65,11 @@ static void message_free_part(sd_bus_message *m, struct bus_body_part *part) {
                 /* If we can reuse the memfd, try that. For that it
                  * can't be sealed yet. */
 
-                if (!part->sealed)
+                if (!part->sealed) {
+                        assert(part->memfd_offset == 0);
+                        assert(part->data == part->mmap_begin);
                         bus_kernel_push_memfd(m->bus, part->memfd, part->data, part->mapped, part->allocated);
-                else {
+                else {
                         if (part->mapped > 0)
                                 assert_se(munmap(part->mmap_begin, part->mapped) == 0);
 
@@ -1103,8 +1105,10 @@ static int part_make_space(
         if (m->poisoned)
                 return -ENOMEM;
 
-        if (!part->data && part->memfd < 0)
+        if (!part->data && part->memfd < 0) {
                 part->memfd = bus_kernel_pop_memfd(m->bus, &part->data, &part->mapped, &part->allocated);
+                part->mmap_begin = part->data;
+        }
 
         if (part->memfd >= 0) {