[CRIU] [PATCH 2/2] ns: Do not reuse PROC_SELF after CLONE_VM child

Andrei Vagin avagin at virtuozzo.com
Wed Mar 22 17:04:02 PDT 2017


On Wed, Mar 22, 2017 at 01:26:27PM +0300, Kirill Tkhai wrote:
> Child opens PROC_SELF, populates open_proc_self_pid and exits. If parent creates
> one more child with the same pid later, the new child will try to reuse PROC_SELF,
> set by exited child. So, close PROC_SELF after the first child has finished.
> 
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
>  criu/namespaces.c |    7 +++++++
>  criu/net.c        |    8 ++++++--
>  2 files changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/criu/namespaces.c b/criu/namespaces.c
> index 77308ccb6..819c75dd5 100644
> --- a/criu/namespaces.c
> +++ b/criu/namespaces.c
> @@ -1039,8 +1039,15 @@ int collect_user_ns(struct ns_id *ns, void *oarg)
>  		}
>  		if (waitpid(pid, &status, 0) != pid) {
>  			pr_perror("Unable to wait the %d process", pid);
> +			close_pid_proc();
>  			return -1;
>  		}
> +		/*
> +		 * Child opened PROC_SELF for pid. If we create one more child
> +		 * with the same pid later, it will try to reuse this /proc/self.
> +		 */
> +		close_pid_proc();

We have this code in two place now, but in the future we are going to
use it for other namespaces, so can we create a helper for this?

> +
>  		if (!WIFEXITED(status) || WEXITSTATUS(status)) {
>  			pr_err("Can't dump nested user_ns: %x\n", status);
>  			return -1;
> diff --git a/criu/net.c b/criu/net.c
> index ae07ff247..3afdd5a90 100644
> --- a/criu/net.c
> +++ b/criu/net.c
> @@ -1788,14 +1788,18 @@ int prepare_net_namespaces()
>  			errno = 0;
>  			if (waitpid(pid, &status, 0) != pid || !WIFEXITED(status) || WEXITSTATUS(status)) {
>  				pr_err("Child waiting: errno=%d, status=%d\n", errno, status);
> +				close_pid_proc();
>  				goto err;
>  			}
> +			/*
> +			 * Child opened PROC_SELF for pid. If we create one more child
> +			 * with the same pid later, it will try to reuse this PROC_SELF.
> +			 */
> +			close_pid_proc();
>  		} else {
>  			if (do_create_net_ns(nsid))
>  				goto err;
> -
>  		}
> -
>  	}
>  
>  	close_service_fd(NS_FD_OFF);
> 


More information about the CRIU mailing list