From 129bb14611c34d35ffc0269d2547dfd7fc67209c Mon Sep 17 00:00:00 2001 From: Kirill Tkhai Date: Wed, 10 Jan 2018 17:03:02 +0300 Subject: [PATCH] files: Prepare clone_service_fd() for overlaping ranges. 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 --- criu/util.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/criu/util.c b/criu/util.c index a1acb03a9..fc5ba6e90 100644 --- a/criu/util.c +++ b/criu/util.c @@ -568,8 +568,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;