Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
ret = pipe(retval_pipe);
if (ret < 0) {
perror("pipe");
ret = pipe(retval_pipe);
if (ret < 0) {
perror("pipe");
goto end;
}
run_as_data.data = data;
goto end;
}
run_as_data.data = data;
-1, 0);
if (child_stack == MAP_FAILED) {
perror("mmap");
-1, 0);
if (child_stack == MAP_FAILED) {
perror("mmap");
&run_as_data);
if (pid < 0) {
perror("clone");
&run_as_data);
if (pid < 0) {
perror("clone");
goto unmap_stack;
}
/* receive return value */
goto unmap_stack;
}
/* receive return value */
pid = waitpid(pid, &status, 0);
if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
perror("wait");
pid = waitpid(pid, &status, 0);
if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
perror("wait");
}
unmap_stack:
ret = munmap(child_stack, RUNAS_CHILD_STACK_SIZE);
if (ret < 0) {
perror("munmap");
}
unmap_stack:
ret = munmap(child_stack, RUNAS_CHILD_STACK_SIZE);
if (ret < 0) {
perror("munmap");
}
close_pipe:
close(retval_pipe[0]);
}
close_pipe:
close(retval_pipe[0]);