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

Kirill Tkhai ktkhai at virtuozzo.com
Fri Mar 24 02:35:11 PDT 2017


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;
 		} 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