Commit cbb6b2da authored by Andrey Vagin's avatar Andrey Vagin Committed by Cyrill Gorcunov

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 <unfinished ...>
41155 <... mmap resumed> )              = -1 EACCES (Permission denied)
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Acked-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent fa28f40a
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment