mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-30 13:58:34 +00:00
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 <ktkhai@virtuozzo.com>
This commit is contained in:
committed by
Andrei Vagin
parent
a589166642
commit
129bb14611
@@ -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;
|
||||
|
Reference in New Issue
Block a user