[CRIU] [PATCH 3/3] restore: Don't close pstree_fd several times

Cyrill Gorcunov gorcunov at openvz.org
Sat Mar 3 16:39:24 EST 2012


There is a scenario when pstree_fd may be tried
to close several times -- if we start crtools
with "detach" option. So instead of adding various
if () constructions -- simply pass a pointer to
file descriptor and use close_safe which is immune
against closed file.

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 cr-restore.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/cr-restore.c b/cr-restore.c
index 46295c3..72f328a 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -1388,19 +1388,19 @@ static int restore_task_with_children(void *_arg)
 	return restore_one_task(me->pid);
 }
 
-static int restore_root_task(int fd, struct cr_options *opts)
+static int restore_root_task(int *fd, struct cr_options *opts)
 {
 	struct pstree_entry e;
 	int ret, i;
 	struct sigaction act, old_act;
 
-	ret = read(fd, &e, sizeof(e));
+	ret = read(*fd, &e, sizeof(e));
 	if (ret != sizeof(e)) {
 		pr_perror("Can't read root pstree entry");
 		return -1;
 	}
 
-	close(fd);
+	close_safe(fd);
 
 	ret = sigaction(SIGCHLD, NULL, &act);
 	if (ret < 0) {
@@ -1467,7 +1467,7 @@ static int restore_all_tasks(pid_t pid, struct cr_options *opts)
 	if (prepare_shared(pstree_fd))
 		goto out;
 
-	ret = restore_root_task(pstree_fd, opts);
+	ret = restore_root_task(&pstree_fd, opts);
 out:
 	close_safe(&pstree_fd);
 	return ret;
-- 
1.7.7.6



More information about the CRIU mailing list