[CRIU] [PATCH] proc_parse: Borrow vmi iif there is file referenced

Cyrill Gorcunov gorcunov at openvz.org
Thu Mar 6 00:19:06 PST 2014


Otherwise we migh propagate previous vfi status
to vmas which actually don't match.

 | (00.005471) 0x2b79227d6000-0x2b79227d8000 (8K) prot 0x5 flags 0x22 off 0 reg vdso ap  shmid: 0
 | (00.005473) 0x2b79227d8000-0x2b79227da000 (8K) prot 0x3 flags 0x22 off 0 reg vdso ap  shmid: 0
 | (00.005475) 0x2b79227f1000-0x2b79227f2000 (4K) prot 0x3 flags 0x22 off 0 reg vdso ap  shmid: 0
 | (00.005476) 0x2b79227f2000-0x2b79227f4000 (8K) prot 0x3 flags 0x22 off 0 reg vdso ap  shmid: 0

Reported-by: Pavel Tikhomirov <snorcht at gmail.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 proc_parse.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/proc_parse.c b/proc_parse.c
index 3a7b5ebd21eb..22248f5d6f18 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -172,14 +172,16 @@ static int vma_get_mapfile(struct vma_area *vma, DIR *mfd,
 	if (prev_vfi->vma && vfi_equal(vfi, prev_vfi)) {
 		struct vma_area *prev = prev_vfi->vma;
 
-		pr_debug("vma %"PRIx64" borrows vfi from previous %"PRIx64"\n",
-				vma->e->start, prev->e->start);
-		vma->vm_file_fd = prev->vm_file_fd;
-		if (prev->e->status & VMA_AREA_SOCKET)
-			vma->e->status |= VMA_AREA_SOCKET | VMA_AREA_REGULAR;
-		vma->file_borrowed = true;
-
-		return 0;
+		if (prev->vm_file_fd >= 0) {
+			pr_debug("vma %"PRIx64" borrows vfi from previous %"PRIx64"\n",
+				 vma->e->start, prev->e->start);
+			vma->vm_file_fd = prev->vm_file_fd;
+			if (prev->e->status & VMA_AREA_SOCKET)
+				vma->e->status |= VMA_AREA_SOCKET | VMA_AREA_REGULAR;
+			vma->file_borrowed = true;
+
+			return 0;
+		}
 	}
 
 	/* Figure out if it's file mapping */
-- 
1.8.3.1



More information about the CRIU mailing list