X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Frunas.c;h=88ed773152cc7c959b81084fb58a93ee9c3409ae;hb=edb025e87637ff74565647ad7756ecac46899d2a;hp=07912a7d68bf7ce97cf7ba765194fd66e28334c8;hpb=059e1d3d3268391d73bb0dc733629eb8edfeb1ed;p=lttng-tools.git diff --git a/src/common/runas.c b/src/common/runas.c index 07912a7d6..88ed77315 100644 --- a/src/common/runas.c +++ b/src/common/runas.c @@ -28,16 +28,30 @@ #include #include #include -#include +#include #include +#include +#include #include "runas.h" #define RUNAS_CHILD_STACK_SIZE 10485760 -#ifndef MAP_STACK -#define MAP_STACK 0 +#ifndef __FreeBSD__ +# ifndef MAP_STACK +# define MAP_STACK 0 +# endif +#else /* FreeBSD MAP_STACK always return -ENOMEM */ +# define MAP_STACK 0 +#endif + +#ifndef MAP_GROWSDOWN +#define MAP_GROWSDOWN 0 +#endif + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON #endif struct run_as_data { @@ -215,6 +229,7 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) ret = pipe(retval_pipe); if (ret < 0) { perror("pipe"); + retval.i = ret; goto end; } run_as_data.data = data; @@ -228,19 +243,18 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) -1, 0); if (child_stack == MAP_FAILED) { perror("mmap"); - ret = -ENOMEM; + retval.i = -ENOMEM; goto close_pipe; } /* * Pointing to the middle of the stack to support architectures * where the stack grows up (HPPA). */ - pid = clone(child_run_as, child_stack + (RUNAS_CHILD_STACK_SIZE / 2), - CLONE_FILES | SIGCHLD, - &run_as_data, NULL); + pid = lttng_clone_files(child_run_as, child_stack + (RUNAS_CHILD_STACK_SIZE / 2), + &run_as_data); if (pid < 0) { perror("clone"); - ret = pid; + retval.i = pid; goto unmap_stack; } /* receive return value */ @@ -264,12 +278,13 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) pid = waitpid(pid, &status, 0); if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) { perror("wait"); - ret = -1; + retval.i = -1; } unmap_stack: ret = munmap(child_stack, RUNAS_CHILD_STACK_SIZE); if (ret < 0) { perror("munmap"); + retval.i = ret; } close_pipe: close(retval_pipe[0]);