-
- pid = clone(child_run_as, child_stack + CHILD_STACK_SIZE,
- CLONE_FILES | SIGCHLD, &run_as_data, NULL);
+ child_stack = mmap(NULL, CHILD_STACK_SIZE,
+ PROT_WRITE | PROT_READ,
+ MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS | MAP_STACK,
+ -1, 0);
+ if (child_stack == MAP_FAILED) {
+ perror("mmap");
+ ret = -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 + (CHILD_STACK_SIZE / 2),
+ CLONE_FILES | SIGCHLD,
+ &run_as_data, NULL);