[CRIU] [PATCH v2] restore: close opened fd

Kinsbursky Stanislav skinsbursky at openvz.org
Mon Feb 20 09:24:07 EST 2012


v2: Some more cleanup around fixup_pages_data()

This is a cleanup patch.

Signed-off-by: Stanislav Kinsbursky <skinsbursky at openvz.org>

---
 cr-restore.c |  116 ++++++++++++++++++++++++++++------------------------------
 1 files changed, 56 insertions(+), 60 deletions(-)

diff --git a/cr-restore.c b/cr-restore.c
index 8208509..4443990 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -641,7 +641,7 @@ static inline bool should_restore_page(int pid, unsigned long va)
 
 static int fixup_pages_data(int pid, int fd)
 {
-	int pgfd, ret;
+	int pgfd = -1, shmfd = -1, ret = -1;
 	u64 va;
 
 	pr_info("%d: Reading shmem pages img\n", pid);
@@ -651,9 +651,8 @@ static int fixup_pages_data(int pid, int fd)
 		return -1;
 
 	while (1) {
-		ret = read_img(pgfd, &va);
-		if (ret < 0)
-			return -1;
+		if (read_img(pgfd, &va) < 0)
+			goto out;
 
 		if (va == 0)
 			break;
@@ -662,35 +661,32 @@ static int fixup_pages_data(int pid, int fd)
 		sendfile(fd, pgfd, NULL, PAGE_SIZE);
 	}
 
-	close(pgfd);
-
-	pgfd = open_image_ro(CR_FD_PAGES_SHMEM, pid);
-	if (pgfd < 0)
-		return -1;
+	shmfd = open_image_ro(CR_FD_PAGES_SHMEM, pid);
+	if (shmfd < 0)
+		goto out;
 
 	while (1) {
-		ret = read_img(pgfd, &va);
-		if (ret < 0)
-			return -1;
+		if (read_img(shmfd, &va) < 0)
+			goto out;
 
 		if (va == 0)
 			break;
 
 		if (!should_restore_page(pid, va)) {
-			lseek(pgfd, PAGE_SIZE, SEEK_CUR);
+			lseek(shmfd, PAGE_SIZE, SEEK_CUR);
 			continue;
 		}
 
 		pr_info("%d: Restoring shared page: %16lx\n", pid, va);
 		write(fd, &va, sizeof(va));
-		sendfile(fd, pgfd, NULL, PAGE_SIZE);
+		sendfile(fd, shmfd, NULL, PAGE_SIZE);
 	}
 
-	close(pgfd);
-
-	write_img(fd, &zero_page_entry);
-
-	return 0;
+	ret = write_img(fd, &zero_page_entry);
+out:
+	close_safe(&pgfd);
+	close_safe(&shmfd);
+	return ret;
 }
 
 static int prepare_image_maps(int fd, int pid)
@@ -709,7 +705,7 @@ static int prepare_image_maps(int fd, int pid)
 static int prepare_and_sigreturn(int pid)
 {
 	char path[PATH_MAX];
-	int fd, fd_new;
+	int fd = -1, fd_new = -1, err = -1;
 	struct stat buf;
 
 	fd = open_image_ro_nocheck(FMT_FNAME_CORE, pid);
@@ -718,38 +714,41 @@ static int prepare_and_sigreturn(int pid)
 
 	if (fstat(fd, &buf)) {
 		pr_perror("%d: Can't stat", pid);
-		return -1;
+		goto out;
 	}
 
 	if (get_image_path(path, sizeof(path), FMT_FNAME_CORE_OUT, pid))
-		return -1;
+		goto out;
 
 	fd_new = open(path, O_RDWR | O_CREAT | O_TRUNC, CR_FD_PERM);
 	if (fd_new < 0) {
 		pr_perror("%d: Can't open new image", pid);
-		return -1;
+		goto out;
 	}
 
 	pr_info("%d: Preparing restore image %s (%li bytes)\n", pid, path, buf.st_size);
 	if (sendfile(fd_new, fd, NULL, buf.st_size) != buf.st_size) {
 		pr_perror("%d: sendfile failed", pid);
-		return -1;
+		goto out;
 	}
-	close(fd);
 
 	if (fstat(fd_new, &buf)) {
 		pr_perror("%d: Can't stat", pid);
-		return -1;
+		goto out;
 	}
 
 	pr_info("fd_new: %li bytes\n", buf.st_size);
 
 	if (prepare_image_maps(fd_new, pid))
-		return -1;
+		goto out;
 
-	close(fd_new);
+	err = 0;
+out:
+	close_safe(&fd);
+	close_safe(&fd_new);
+	if (err)
+		return err;
 	sigreturn_restore(pid);
-
 	return 0;
 }
 
@@ -996,13 +995,13 @@ static int prepare_sigactions(int pid)
 	}
 
 err:
-	close(fd_sigact);
+	close_safe(&fd_sigact);
 	return ret;
 }
 
 static int prepare_pipes(int pid)
 {
-	int ret = 0;
+	int ret = -1;
 	int pipes_fd;
 
 	struct pipe_list_entry *le, *buf;
@@ -1018,10 +1017,8 @@ static int prepare_pipes(int pid)
 		return -1;
 
 	buf = xmalloc(buf_size);
-	if (!buf) {
-		close(pipes_fd);
-		return -1;
-	}
+	if (!buf)
+		goto out;
 
 	while (1) {
 		struct list_head *cur;
@@ -1062,7 +1059,8 @@ static int prepare_pipes(int pid)
 		}
 
 	free(buf);
-	close(pipes_fd);
+out:
+	close_safe(&pipes_fd);
 	return ret;
 }
 
@@ -1176,33 +1174,29 @@ static int restore_one_zombie(int pid, int exit_code)
 
 static int check_core_header(int pid, struct task_core_entry *tc)
 {
-	int fd, ret;
+	int fd = -1, ret = -1;
 	struct image_header hdr;
 
 	fd = open_image_ro(CR_FD_CORE, pid);
 	if (fd < 0)
 		return -1;
 
-	if (read_img(fd, &hdr) < 0) {
-		close(fd);
-		return -1;
-	}
+	if (read_img(fd, &hdr) < 0)
+		goto out;
 
 	if (hdr.version != HEADER_VERSION) {
 		pr_err("Core version mismatch %d\n", (int)hdr.version);
-		close(fd);
-		return -1;
+		goto out;
 	}
 
 	if (hdr.arch != HEADER_ARCH_X86_64) {
 		pr_err("Core arch mismatch %d\n", (int)hdr.arch);
-		close(fd);
-		return -1;
+		goto out;
 	}
 
 	ret = read_img(fd, tc);
-	close(fd);
-
+out:
+	close_safe(&fd);
 	return ret < 0 ? ret : 0;
 }
 
@@ -1455,17 +1449,21 @@ static int restore_root_task(int fd, struct cr_options *opts)
 
 static int restore_all_tasks(pid_t pid, struct cr_options *opts)
 {
-	int pstree_fd;
+	int pstree_fd = -1;
 	u32 type = 0;
+	int ret = -1;
 
 	pstree_fd = open_image_ro(CR_FD_PSTREE, pstree_pid);
 	if (pstree_fd < 0)
 		return -1;
 
 	if (prepare_shared(pstree_fd))
-		return -1;
+		goto out;
 
-	return restore_root_task(pstree_fd, opts);
+	ret = restore_root_task(pstree_fd, opts);
+out:
+	close_safe(&pstree_fd);
+	return ret;
 }
 
 static long restorer_get_vma_hint(pid_t pid, struct list_head *self_vma_list, long vma_len)
@@ -1489,7 +1487,7 @@ static long restorer_get_vma_hint(pid_t pid, struct list_head *self_vma_list, lo
 
 	fd = open_image_ro_nocheck(FMT_FNAME_CORE, pid);
 	if (fd < 0)
-		goto err_or_found;
+		return -1;
 
 	prev_vma_end = 0;
 
@@ -1499,7 +1497,7 @@ static long restorer_get_vma_hint(pid_t pid, struct list_head *self_vma_list, lo
 		ret = read(fd, &vma, sizeof(vma));
 		if (ret && ret != sizeof(vma)) {
 			pr_perror("Can't read vma entry from core-%d", pid);
-			goto err_or_found;
+			break;
 		}
 
 		if (!prev_vma_end) {
@@ -1511,17 +1509,14 @@ static long restorer_get_vma_hint(pid_t pid, struct list_head *self_vma_list, lo
 			list_for_each_entry(vma_area, self_vma_list, list) {
 				if (vma_area->vma.start <= prev_vma_end &&
 				    vma_area->vma.end >= prev_vma_end)
-					goto err_or_found;
+					break;
 			}
 			hint = prev_vma_end;
-			goto err_or_found;
+			break;
 		} else
 			prev_vma_end = vma.end;
 	}
-
-err_or_found:
-	if (fd >= 0)
-		close(fd);
+	close_safe(&fd);
 	return hint;
 }
 
@@ -1592,7 +1587,7 @@ static int prepare_itimers(int pid, struct task_restore_core_args *args)
 					&ie[2], &args->itimers[2]);
 	}
 
-	close(fd);
+	close_safe(&fd);
 	return ret;
 }
 
@@ -1606,7 +1601,7 @@ static int prepare_creds(int pid, struct task_restore_core_args *args)
 
 	ret = read_img(fd, &args->creds);
 
-	close(fd);
+	close_safe(&fd);
 
 	/* XXX -- validate creds here? */
 
@@ -1882,6 +1877,7 @@ static void sigreturn_restore(pid_t pid)
 err:
 	free_mappings(&self_vma_list);
 	close_safe(&fd_core);
+	close_safe(&fd_fdinfo);
 	close_safe(&fd_self_vmas);
 
 	if (exec_mem != MAP_FAILED)



More information about the CRIU mailing list