mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-01-23 10:16:41 +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:
parent
a589166642
commit
129bb14611
1 changed files with 7 additions and 2 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue