[CRIU] [PATCH] restore: close opened fd
Kinsbursky Stanislav
skinsbursky at openvz.org
Mon Feb 20 08:18:42 EST 2012
This is a cleanup patch. It adds some close() calls where required and
replaces close() with closer_safe().
Signed-off-by: Stanislav Kinsbursky <skinsbursky at openvz.org>
---
cr-restore.c | 110 ++++++++++++++++++++++++++++------------------------------
1 files changed, 54 insertions(+), 56 deletions(-)
diff --git a/cr-restore.c b/cr-restore.c
index 8208509..046dd48 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;
u64 va;
pr_info("%d: Reading shmem pages img\n", pid);
@@ -653,7 +653,7 @@ static int fixup_pages_data(int pid, int fd)
while (1) {
ret = read_img(pgfd, &va);
if (ret < 0)
- return -1;
+ goto out;
if (va == 0)
break;
@@ -662,35 +662,33 @@ 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);
+ ret = read_img(shmfd, &va);
if (ret < 0)
- return -1;
+ 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;
+out:
+ close_safe(&pgfd);
+ close_safe(&shmfd);
+ return (ret < 0) ? ret : 0;
}
static int prepare_image_maps(int fd, int pid)
@@ -709,7 +707,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 +716,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 +997,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 +1019,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 +1061,8 @@ static int prepare_pipes(int pid)
}
free(buf);
- close(pipes_fd);
+out:
+ close_safe(&pipes_fd);
return ret;
}
@@ -1176,33 +1176,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 +1451,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 +1489,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 +1499,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 +1511,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 +1589,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 +1603,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 +1879,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