From 928d116d910ec40cfd31db79e67973d889704d5b 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 Signed-off-by: Andrei Vagin --- criu/util.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/criu/util.c b/criu/util.c index 7deb34ee6..0758c7b80 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;