[Devel] [PATCH] ct: fix exec to really enter into pidns (v2)
Andrey Vagin
avagin at openvz.org
Tue Jul 9 10:25:44 PDT 2013
setns() of the pid namespace unlike unsharing of other namespaces
does not take affect immediately. Instead it affects the children
created with fork and clone.
v2: don't forget about the end mark in close_fds
https://bugzilla.openvz.org/show_bug.cgi?id=2658
Reported-by: Igor Gnatenko <i.gnatenko.brain at gmail.com>
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
src/lib/hooks_ct.c | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c
index 3cd1404..9854bc9 100644
--- a/src/lib/hooks_ct.c
+++ b/src/lib/hooks_ct.c
@@ -536,9 +536,8 @@ static int ct_enter(vps_handler *h, envid_t veid, const char *root, int flags)
char path[STR_SIZE]; /* long enough for any pid */
pid_t task_pid;
int ret = VZ_RESOURCE_ERROR;
- int err;
bool joined_mnt_ns = false;
- int fd;
+ int fd, err, status;
if (!h->can_join_pidns) {
logger(-1, 0, "Kernel lacks setns for pid namespace");
@@ -621,7 +620,38 @@ static int ct_enter(vps_handler *h, envid_t veid, const char *root, int flags)
if (!joined_mnt_ns && (ret = ct_chroot(root)))
goto out;
+ /*
+ * setns() of the pid namespace unlike unsharing of other namespaces
+ * does not take affect immediately. Instead it affects the children
+ * created with fork and clone.
+ */
+ task_pid = fork();
+ if (task_pid < 0) {
+ logger(-1, errno, "Unable to fork");
+ goto out;
+ }
+
ret = 0;
+ if (task_pid == 0)
+ goto out;
+
+ close_fds(false, -1);
+ while (1) {
+ ret = waitpid(task_pid, &status, 0);
+ if (ret < 0) {
+ logger(-1, errno, "Unable to wait the child %d", task_pid);
+ exit(VZ_RESOURCE_ERROR);
+ }
+ if (WIFSTOPPED(status) || WIFCONTINUED(status))
+ continue;
+
+ break;
+ }
+
+ if (WIFEXITED(status))
+ exit(WEXITSTATUS(status));
+ else
+ exit(-WTERMSIG(status));
out:
closedir(dp);
--
1.8.3.1
More information about the Devel
mailing list