From 02168054239c94b8aa0a59cd127557e9ba2baa02 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 25 May 2016 16:29:00 +0300 Subject: [PATCH] rst-malloc: Do not grow sh-remap memory The mremap() grow on anonymous shared memory doesn't produce usable segment, as the underlying kernel tmpfs file doesn't get truncated. So any access to new mem will result in sigbus. Disable this grow for now, we only need few of such memory. Signed-off-by: Pavel Emelyanov Reviewed-by: Cyrill Gorcunov --- criu/rst-malloc.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/criu/rst-malloc.c b/criu/rst-malloc.c index 1117b4e6c..35b92ba37 100644 --- a/criu/rst-malloc.c +++ b/criu/rst-malloc.c @@ -66,7 +66,18 @@ static int grow_remap(struct rst_mem_type_s *t, int flag, unsigned long size) */ aux = mmap(NULL, size, PROT_READ | PROT_WRITE, flag | MAP_ANON, 0, 0); - else + else { + if (flag & MAP_SHARED) { + /* + * Anon shared memory cannot grow with + * mremap, anon-shmem file size doesn't + * chage and memory access generates + * SIGBUS. We should truncate the guy, + * but for now we don't need it. + */ + pr_err("Can't grow RM_SHREMAP memory\n"); + return -1; + } /* * We'll have to remap all objects into restorer * address space and get their new addresses. Since @@ -78,6 +89,7 @@ static int grow_remap(struct rst_mem_type_s *t, int flag, unsigned long size) */ aux = mremap(t->buf, t->size, t->size + size, MREMAP_MAYMOVE); + } if (aux == MAP_FAILED) return -1;