This is needed to make sure, that mnt ns is the last (otherwise join other
namespaces after mnt ns will fail).

Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>
---
 lib/env_nsops.c |   39 +++++++++++----------------------------
 1 file changed, 11 insertions(+), 28 deletions(-)

diff --git a/lib/env_nsops.c b/lib/env_nsops.c
index 0771eb2..d885d1c 100644
--- a/lib/env_nsops.c
+++ b/lib/env_nsops.c
@@ -885,7 +885,7 @@ static int ns_is_env_run(struct vzctl_env_handle *h)
        return cg_env_get_ve_state(EID(h));
 }
 
-int set_ns(pid_t pid, const char *name, int flags)
+static int set_ns(pid_t pid, const char *name, int flags)
 {
        int ret, fd;
        char path[PATH_MAX];
@@ -924,11 +924,10 @@ int enter_net_ns(struct vzctl_env_handle *h, pid_t 
*ct_pid)
 
 static int ns_env_enter(struct vzctl_env_handle *h, int flags)
 {
-       DIR *dp;
-       struct dirent *ep;
        pid_t pid;
-       char path[PATH_MAX];
-       int ret;
+       int ret, i;
+       const char *ns[] = {"cgroup", "ipc", "net", "uts", "pid",
+                           "pid_for_children", "user", "mnt"};
 
        ret = reset_loginuid();
        if (ret)
@@ -939,37 +938,21 @@ static int ns_env_enter(struct vzctl_env_handle *h, int 
flags)
 
        logger(10, 0, "* Attach by pid %d", pid);
 
-       snprintf(path, sizeof(path), "/proc/%d/ns", pid);
-       dp = opendir(path);
-       if (dp == NULL)
-               return vzctl_err(-1, errno, "Unable to open dir %s", path);
-
        ret = cg_attach_task(EID(h), getpid(), NULL, NULL);
        if (ret)
-               goto err;
-
-       while ((ep = readdir (dp))) {
-               if (!strcmp(ep->d_name, ".") ||
-                   !strcmp(ep->d_name, ".."))
-                       continue;
+               return ret;
 
-               ret = set_ns(pid, ep->d_name, 0);
+       for (i = 0; i < sizeof(ns) / sizeof(ns[0]); ++i) {
+               ret = set_ns(pid, ns[i], 0);
                if (ret)
-                       goto err;
+                       return ret;
        }
 
        /* Clear supplementary group IDs */
-       if (setgroups(0, NULL)) {
-               ret = vzctl_err(-1, errno, "ns_env_enter: setgroups()");
-               goto err;
-       }
-       
-       ret = set_personality32();
+       if (setgroups(0, NULL))
+               return vzctl_err(-1, errno, "ns_env_enter: setgroups()");
 
-err:
-       closedir(dp);
-
-       return ret;
+       return set_personality32();
 }
 
 static int ns_env_exec(struct vzctl_env_handle *h, struct exec_param *param,

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to