From cbb6b2da3d618cd1ea3e82a90bde1bb56d96139e Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Fri, 2 Dec 2011 15:33:00 +0400 Subject: [PATCH] PROT_WRITE isn't need for a mapping of a file with MAP_SHARED A file destriptor is opened for read-only and mmap with PROT_WRITE fails. We don't need PROT_WRITE for this case, because a file contains up to date data. lr-x------ 1 root root 64 Dec 1 19:10 20 -> /usr/lib64/gconv/gconv-modules.cache pos: 0 flags: 0100000 41155 mmap(0x7f2c3d6cf000, 28672, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, 20, 0 41155 <... mmap resumed> ) = -1 EACCES (Permission denied) Signed-off-by: Andrey Vagin Acked-by: Pavel Emelyanov Signed-off-by: Cyrill Gorcunov --- restorer.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/restorer.c b/restorer.c index 62217be03..b8a3f6af6 100644 --- a/restorer.c +++ b/restorer.c @@ -216,6 +216,8 @@ self_len_end: */ sys_lseek(args->fd_core, GET_FILE_OFF_AFTER(struct core_entry), SEEK_SET); while (1) { + int prot; + ret = sys_read(args->fd_core, vma_entry, sizeof(*vma_entry)); if (!ret) break; @@ -242,6 +244,12 @@ self_len_end: vma_entry->flags &= ~MAP_ANONYMOUS; } + prot = vma_entry->prot; + + /* A mapping of file with MAP_SHARED is up to date */ + if (vma_entry->fd == -1 || !(vma_entry->flags & MAP_SHARED)) + prot |= PROT_WRITE; + /* * Should map memory here. Note we map them as * writable since we're going to restore page @@ -249,7 +257,7 @@ self_len_end: */ va = sys_mmap((void *)vma_entry->start, vma_entry_len(vma_entry), - vma_entry->prot | PROT_WRITE, + prot, vma_entry->flags | MAP_FIXED, vma_entry->fd, vma_entry->pgoff);