]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
memfd: map unsealed files as MAP_SHARED
authorDavid Herrmann <dh.herrmann@gmail.com>
Mon, 18 Aug 2014 11:05:48 +0000 (13:05 +0200)
committerDavid Herrmann <dh.herrmann@gmail.com>
Mon, 18 Aug 2014 11:05:48 +0000 (13:05 +0200)
We need to map sealed files as MAP_PRIVATE so far as the kernel treats
MAP_SHARED as writable mapping (you can run mprotect(PROT_WRITE) at any
time on those). However, unsealed files must be mapped as MAP_SHARED.
Otherwise, we never end up writing to the real file.

src/shared/memfd.c

index 6804b423616bf507b925ccb0676b6c9b608701f8..d94c6268ddf5e376df3ea29956b22b4c1ce8d9b7 100644 (file)
@@ -176,7 +176,11 @@ int sd_memfd_map(sd_memfd *m, uint64_t offset, size_t size, void **p) {
         if (sealed < 0)
                 return sealed;
 
-        q = mmap(NULL, size, sealed ? PROT_READ : PROT_READ|PROT_WRITE, MAP_PRIVATE, m->fd, offset);
+        if (sealed)
+                q = mmap(NULL, size, PROT_READ, MAP_PRIVATE, m->fd, offset);
+        else
+                q = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, offset);
+
         if (q == MAP_FAILED)
                 return -errno;