Commit 4f9e509c authored by Kir Kolyshkin's avatar Kir Kolyshkin Committed by Pavel Emelyanov

restore_fs(): don't leak fds on error

First, if we can't open dd_cwd, we leak opened dd_root.

Second, if chroot(dd_root) fails, we leak opened dd_cwd.

Instead of adding more close() statements in place, let's
change the code to close both fds on exit path.

Reported by Coverity, CID 51639, CID 51631.
Signed-off-by: 's avatarKir Kolyshkin <kir@openvz.org>
Acked-by: 's avatarAndrew Vagin <avagin@odin.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 8d11952f
......@@ -1077,7 +1077,7 @@ static int fchroot(int fd)
int restore_fs(struct pstree_item *me)
{
int dd_root, dd_cwd, ret, err = -1;
int dd_root = -1, dd_cwd = -1, ret, err = -1;
struct rst_info *ri = rsti(me);
/*
......@@ -1104,14 +1104,12 @@ int restore_fs(struct pstree_item *me)
*/
ret = fchroot(dd_root);
close(dd_root);
if (ret < 0) {
pr_perror("Can't change root");
goto out;
}
ret = fchdir(dd_cwd);
close(dd_cwd);
if (ret < 0) {
pr_perror("Can't change cwd");
goto out;
......@@ -1124,6 +1122,11 @@ int restore_fs(struct pstree_item *me)
err = 0;
out:
if (dd_cwd >= 0)
close(dd_cwd);
if (dd_root >= 0)
close(dd_root);
return err;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment