[CRIU] [PATCH 4/5] ns: Fix wrong opened net ns file

Andrei Vagin avagin at virtuozzo.com
Tue Mar 28 14:38:26 PDT 2017


On Tue, Mar 28, 2017 at 12:32:08PM +0300, Kirill Tkhai wrote:
> On 27.03.2017 23:36, Andrei Vagin wrote:
> > On Fri, Mar 24, 2017 at 12:35:11PM +0300, Kirill Tkhai wrote:
> >> Since net ns is assigned after prepare_fds() and,
> >> in common case, at the moment of open_ns_fd() call
> >> task points to a net ns, which differs to its target
> >> net ns, we can't get the ns from a task. So, get it
> >> from fdstore. Also, support userns ns fds.
> >>
> >> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> >> ---
> >>  criu/namespaces.c |   21 ++++++++++++++++++++-
> >>  1 file changed, 20 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/criu/namespaces.c b/criu/namespaces.c
> >> index e4555251..ee309045 100644
> >> --- a/criu/namespaces.c
> >> +++ b/criu/namespaces.c
> >> @@ -556,8 +556,22 @@ static int open_ns_fd(struct file_desc *d, int *new_fd)
> >>  	struct ns_file_info *nfi = container_of(d, struct ns_file_info, d);
> >>  	struct pstree_item *item, *t;
> >>  	struct ns_desc *nd = NULL;
> >> +	struct ns_id *ns;
> >> +	int nsfd_id, fd;
> >>  	char path[64];
> >> -	int fd;
> >> +
> >> +	for (ns = ns_ids; ns != NULL; ns = ns->next) {
> >> +		if (ns->id != nfi->nfe->ns_id)
> >> +			continue;
> >> +		if (ns->nd == &user_ns_desc && (root_ns_mask & CLONE_NEWUSER))
> >> +			nsfd_id = ns->user.nsfd_id;
> >> +		else if (ns->nd == &net_ns_desc && (root_ns_mask & CLONE_NEWNET))
> >> +			nsfd_id = ns->net.nsfd_id;
> >> +		else
> >> +			break;
> >> +		fd = fdstore_get(nsfd_id);
> >> +		goto check_open;
> >> +	}
> >>  
> >>  	/*
> >>  	 * Find out who can open us.
> >> @@ -575,6 +589,10 @@ static int open_ns_fd(struct file_desc *d, int *new_fd)
> >>  			item = t;
> >>  			nd = &net_ns_desc;
> >>  			break;
> >> +		} else if (ids->user_ns_id == nfi->nfe->ns_id) {
> >> +			item = t;
> >> +			nd = &user_ns_desc;
> >> +			break;
> > 
> > hm, why do we need this code here? The first loop has to handle them,
> > doesn't it?
> 
> We do add net_ns and user_ns fds to fdstore only if we have
> appropriate bit in root_ns_mask is set.

Could you add a comment about this?
>  
> >>  		} else if (ids->ipc_ns_id == nfi->nfe->ns_id) {
> >>  			item = t;
> >>  			nd = &ipc_ns_desc;
> >> @@ -608,6 +626,7 @@ static int open_ns_fd(struct file_desc *d, int *new_fd)
> >>  	path[sizeof(path) - 1] = '\0';
> >>  
> >>  	fd = open(path, nfi->nfe->flags);
> >> +check_open:
> >>  	if (fd < 0) {
> >>  		pr_perror("Can't open file %s on restore", path);
> >>  		return fd;
> >>


More information about the CRIU mailing list