mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-28 12:36:47 +00:00
files: Fail dump if dump_one_file() fails
When dumping a process with a large number of open files, dump_task_files_seized() processes the fds in batches. If dump_one_file() results in an error, processing of the current batch is stopped but the next batch (if any) will still be fetched and the error value is overwritten. The result is a corrupt dump image (the fdinfo file is missing a bunch of fds) which results in restore failure. Also close all received fds after an error (previously the skipped ones were left open). Signed-off-by: Andy Tucker <agtucker@google.com> Reviewed-by: Dmitry Safonov <0x7f454c46@gmail.com> Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
parent
3e86fb12bc
commit
9eb9abb62f
1 changed files with 4 additions and 2 deletions
|
|
@ -606,7 +606,7 @@ int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
|
|||
goto err;
|
||||
|
||||
ret = 0; /* Don't fail if nr_fds == 0 */
|
||||
for (off = 0; off < dfds->nr_fds; off += nr_fds) {
|
||||
for (off = 0; ret == 0 && off < dfds->nr_fds; off += nr_fds) {
|
||||
if (nr_fds + off > dfds->nr_fds)
|
||||
nr_fds = dfds->nr_fds - off;
|
||||
|
||||
|
|
@ -620,7 +620,6 @@ int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
|
|||
|
||||
ret = dump_one_file(item->pid, dfds->fds[i + off],
|
||||
lfds[i], opts + i, ctl, &e);
|
||||
close(lfds[i]);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
|
|
@ -628,6 +627,9 @@ int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
|
|||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_fds; i++)
|
||||
close(lfds[i]);
|
||||
}
|
||||
|
||||
pr_info("----------------------------------------\n");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue