[CRIU] [PATCH 11/12] files: Prepare clone_service_fd() for overlaping ranges.
    Kirill Tkhai 
    ktkhai at virtuozzo.com
       
    Tue Dec 26 18:47:18 MSK 2017
    
    
  
In normal life this is impossible. But in case of big
fdt::nr number (many processes, sharing the same files),
and custom service_fd_base, normal (!CLONE_FILES) child
of such process may have overlaping service fds with
parent's fdt. This patch introduces "memmove()" behavior
(currently there is "memcpy()" behavior) and this will
be used in next patch.
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/util.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/criu/util.c b/criu/util.c
index 5b260cef4..2ae4d8e64 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -547,8 +547,13 @@ int clone_service_fd(struct pstree_item *me)
 	if (service_fd_id == id)
 		return 0;
 
-	for (i = SERVICE_FD_MIN + 1; i < SERVICE_FD_MAX; i++)
-		move_service_fd(me, i, id, new_base);
+	/* Dup sfds in memmove() style: they may overlap */
+	if (get_service_fd(LOG_FD_OFF) > __get_service_fd(LOG_FD_OFF, id))
+		for (i = SERVICE_FD_MIN + 1; i < SERVICE_FD_MAX; i++)
+			move_service_fd(me, i, id, new_base);
+	else
+		for (i = SERVICE_FD_MAX - 1; i > SERVICE_FD_MIN; i--)
+			move_service_fd(me, i, id, new_base);
 
 	service_fd_id = id;
 	ret = 0;
    
    
More information about the CRIU
mailing list