[CRIU] [PATCH] fs: Opening FE-s after fchdir doesn't work
Andrew Vagin
avagin at parallels.com
Mon Jun 9 06:31:00 PDT 2014
Acked-by: Andrew Vagin <avagin at parallels.com>
On Mon, Jun 09, 2014 at 04:51:16PM +0400, Pavel Emelyanov wrote:
> It uses absolute file names, so any open-s should happen _before_
> we change tasks' root.
>
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> ---
> files.c | 31 +++++++++++++++++--------------
> 1 file changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/files.c b/files.c
> index a8cd87f..18d0f97 100644
> --- a/files.c
> +++ b/files.c
> @@ -1020,7 +1020,7 @@ static int fchroot(int fd)
>
> int prepare_fs(int pid)
> {
> - int ifd, dd, ret, err = -1;
> + int ifd, dd_root, dd_cwd, ret, err = -1;
> FsEntry *fe;
>
> ifd = open_image(CR_FD_FS, O_RSTR, pid);
> @@ -1031,34 +1031,37 @@ int prepare_fs(int pid)
> goto out_i;
>
> /*
> - * Restore root
> + * First -- open both descriptors. We will not
> + * be able to open the cwd one after we chroot.
> */
>
> - dd = open_reg_by_id(fe->root_id);
> - if (dd < 0) {
> + dd_root = open_reg_by_id(fe->root_id);
> + if (dd_root < 0) {
> pr_err("Can't open root %#x\n", fe->root_id);
> goto err;
> }
>
> - ret = fchroot(dd);
> - close(dd);
> - if (ret < 0) {
> - pr_perror("Can't change root");
> + dd_cwd = open_reg_by_id(fe->cwd_id);
> + if (dd_cwd < 0) {
> + pr_err("Can't open cwd %#x\n", fe->cwd_id);
> goto err;
> }
>
> /*
> - * Restore CWD
> + * Now do chroot/chdir. Chroot goes first as it
> + * calls chdir into proc service descriptor so
> + * we'd need to fix chdir after it anyway.
> */
>
> - dd = open_reg_by_id(fe->cwd_id);
> - if (dd < 0) {
> - pr_err("Can't open cwd %#x\n", fe->cwd_id);
> + ret = fchroot(dd_root);
> + close(dd_root);
> + if (ret < 0) {
> + pr_perror("Can't change root");
> goto err;
> }
>
> - ret = fchdir(dd);
> - close(dd);
> + ret = fchdir(dd_cwd);
> + close(dd_cwd);
> if (ret < 0) {
> pr_perror("Can't change cwd");
> goto err;
> --
> 1.8.4.2
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list