projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
freebsd: do not use MAP_STACK
[lttng-tools.git]
/
src
/
common
/
runas.c
diff --git
a/src/common/runas.c
b/src/common/runas.c
index bee107951d8664e6f111ed5ff260574407f0c3a3..88ed773152cc7c959b81084fb58a93ee9c3409ae 100644
(file)
--- a/
src/common/runas.c
+++ b/
src/common/runas.c
@@
-38,8
+38,20
@@
#define RUNAS_CHILD_STACK_SIZE 10485760
#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 {
#endif
struct run_as_data {
@@
-217,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");
ret = pipe(retval_pipe);
if (ret < 0) {
perror("pipe");
+ retval.i = ret;
goto end;
}
run_as_data.data = data;
goto end;
}
run_as_data.data = data;
@@
-230,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");
-1, 0);
if (child_stack == MAP_FAILED) {
perror("mmap");
- ret = -ENOMEM;
+ ret
val.i
= -ENOMEM;
goto close_pipe;
}
/*
* Pointing to the middle of the stack to support architectures
* where the stack grows up (HPPA).
*/
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");
if (pid < 0) {
perror("clone");
- ret = pid;
+ ret
val.i
= pid;
goto unmap_stack;
}
/* receive return value */
goto unmap_stack;
}
/* receive return value */
@@
-266,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");
pid = waitpid(pid, &status, 0);
if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
perror("wait");
- ret = -1;
+ ret
val.i
= -1;
}
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");
+ retval.i = ret;
}
close_pipe:
close(retval_pipe[0]);
}
close_pipe:
close(retval_pipe[0]);
This page took
0.026757 seconds
and
4
git commands to generate.