diff --git a/repos/libports/recipes/pkg/test-libc_fork/runtime b/repos/libports/recipes/pkg/test-libc_fork/runtime index daaac5abc5..57914546ea 100644 --- a/repos/libports/recipes/pkg/test-libc_fork/runtime +++ b/repos/libports/recipes/pkg/test-libc_fork/runtime @@ -28,6 +28,7 @@ + diff --git a/repos/libports/src/lib/libc/kernel.cc b/repos/libports/src/lib/libc/kernel.cc index ac208b223e..50fa93bac1 100644 --- a/repos/libports/src/lib/libc/kernel.cc +++ b/repos/libports/src/lib/libc/kernel.cc @@ -19,6 +19,9 @@ Libc::Kernel * Libc::Kernel::_kernel_ptr; +extern char **environ; + + /** * Blockade for main context */ @@ -346,6 +349,9 @@ void Libc::Kernel::_clone_state_from_parent() _cloned_heap_ranges.for_each([&] (Cloned_malloc_heap_range &heap_range) { heap_range.import_content(*_clone_connection); }); + /* value of global environ pointer (the env vars are already on the heap) */ + _clone_connection->memory_content(&environ, sizeof(environ)); + /* fetch user contex of the parent's application */ _clone_connection->memory_content(&_user_context, sizeof(_user_context)); _clone_connection->memory_content(&_main_monitor_job, sizeof(_main_monitor_job)); diff --git a/repos/libports/src/test/fork/test.cc b/repos/libports/src/test/fork/test.cc index 6f4ec4f282..b1ef7398ff 100644 --- a/repos/libports/src/test/fork/test.cc +++ b/repos/libports/src/test/fork/test.cc @@ -38,6 +38,12 @@ int main(int, char **argv) printf("pid %d: fork returned %d\n", getpid(), fork_ret); + /* check the consistency of known environment variable in both processes */ + if (!getenv("WIZARD") || strcmp(getenv("WIZARD"), "gandalf") != 0) { + printf("Error: inheritance of environment variable failed\n"); + return -1; + } + /* child */ if (fork_ret == 0) { printf("pid %d: child says hello\n", getpid());