X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Frunas.c;h=745a6d0d13643d2333ee1bfe5c8b3e4c8fe4fb3b;hb=a8b0b34167a4d7a46373b463d0744d75f2416bbb;hp=cc503412689f55f48524ef515d608a9f1a4cdf4b;hpb=10a8a2237343699e3923d87e24dbf2d7fe225377;p=lttng-tools.git diff --git a/src/common/runas.c b/src/common/runas.c index cc5034126..745a6d0d1 100644 --- a/src/common/runas.c +++ b/src/common/runas.c @@ -30,12 +30,16 @@ #include #include -#include +#include #include "runas.h" #define RUNAS_CHILD_STACK_SIZE 10485760 +#ifndef MAP_STACK +#define MAP_STACK 0 +#endif + struct run_as_data { int (*cmd)(void *data); void *data; @@ -211,6 +215,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; @@ -224,7 +229,7 @@ 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; } /* @@ -236,7 +241,7 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) &run_as_data, NULL); if (pid < 0) { perror("clone"); - ret = pid; + retval.i = pid; goto unmap_stack; } /* receive return value */ @@ -260,12 +265,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]);