From: David Herrmann Date: Mon, 18 Aug 2014 11:05:48 +0000 (+0200) Subject: memfd: map unsealed files as MAP_SHARED X-Git-Tag: v216~61^2~3 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=23972f4244f7609658c2a17f85508d50e4739990;p=elogind.git memfd: map unsealed files as MAP_SHARED 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. --- diff --git a/src/shared/memfd.c b/src/shared/memfd.c index 6804b4236..d94c6268d 100644 --- a/src/shared/memfd.c +++ b/src/shared/memfd.c @@ -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;