From ca004ec2730af32936310f0e5b667073f37f5c56 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Mon, 4 Jul 2016 22:55:33 +0800 Subject: [PATCH] use fork() instead of fragile clone(CLONE_VM|CLONE_FILES) Signed-off-by: Lai Jiangshan --- src/exec.c | 44 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src/exec.c b/src/exec.c index ae093ab..dae3437 100644 --- a/src/exec.c +++ b/src/exec.c @@ -528,17 +528,8 @@ out: return ret; } -struct hyper_exec_arg { - struct hyper_pod *pod; - struct hyper_exec *exec; - int pipe[2]; -}; - -static int hyper_do_exec_cmd(void *data) +static int hyper_do_exec_cmd(struct hyper_exec *exec, struct hyper_pod *pod, int pipe) { - struct hyper_exec_arg *arg = data; - struct hyper_exec *exec = arg->exec; - struct hyper_pod *pod = arg->pod; int pid = -1, ret = -1; char path[512]; int pidns; @@ -578,7 +569,7 @@ static int hyper_do_exec_cmd(void *data) exit: _exit(125); out: - hyper_send_type(arg->pipe[1], pid); + hyper_send_type(pipe, pid); _exit(ret); } @@ -641,13 +632,7 @@ int hyper_exec_cmd(char *json, int length) { struct hyper_exec *exec; struct hyper_pod *pod = &global_pod; - int stacksize = getpagesize() * 4; - void *stack = NULL; - struct hyper_exec_arg arg = { - .pod = pod, - .exec = NULL, - .pipe = {-1, -1}, - }; + int pipe[2] = {-1, -1}; int pid, ret = -1; uint32_t type; @@ -678,27 +663,21 @@ int hyper_exec_cmd(char *json, int length) list_add_tail(&exec->list, &pod->exec_head); exec->ref++; - if (pipe2(arg.pipe, O_CLOEXEC) < 0) { + if (pipe2(pipe, O_CLOEXEC) < 0) { perror("create pipe between pod init execcmd failed"); goto close_tty; } - arg.exec = exec; - - stack = malloc(stacksize); - if (stack == NULL) { - perror("fail to allocate stack for container init"); - goto close_tty; - } - - pid = clone(hyper_do_exec_cmd, stack + stacksize, CLONE_VM| CLONE_FILES| SIGQUIT, &arg); - fprintf(stdout, "do_exec_cmd pid %d\n", pid); + pid = fork(); if (pid < 0) { perror("clone hyper_do_exec_cmd failed"); goto close_tty; + } else if (pid == 0) { + hyper_do_exec_cmd(exec, pod, pipe[1]); } + fprintf(stdout, "do_exec_cmd pid %d\n", pid); - if (hyper_get_type(arg.pipe[0], &type) < 0 || (int)type < 0) { + if (hyper_get_type(pipe[0], &type) < 0 || (int)type < 0) { fprintf(stderr, "hyper init doesn't get execcmd ready message\n"); goto close_tty; } @@ -707,9 +686,8 @@ int hyper_exec_cmd(char *json, int length) fprintf(stdout, "%s get ready message %"PRIu32 "\n", __func__, type); ret = 0; out: - close(arg.pipe[0]); - close(arg.pipe[1]); - free(stack); + close(pipe[0]); + close(pipe[1]); return ret; close_tty: hyper_reset_event(&exec->stdinev);