diff --git a/pressure-vessel/runtime.c b/pressure-vessel/runtime.c index cb22c91bb4e62962b7f150d75d477f8df0e03bd3..7737e6e4e2478f3a3314fd5fb7703f2ccdaa208d 100644 --- a/pressure-vessel/runtime.c +++ b/pressure-vessel/runtime.c @@ -318,7 +318,7 @@ runtime_architecture_init (RuntimeArchitecture *self, * assume that this is the same as whether we can run them * on the host, if different. */ argv[0] = self->capsule_capture_libs; - self->ld_so = pv_capture_output (argv, NULL); + self->ld_so = pv_capture_output (argv, NULL, NULL); if (self->ld_so == NULL) { @@ -2843,7 +2843,8 @@ pv_runtime_get_ld_so (PvRuntime *self, flatpak_bwrap_finish (temp_bwrap); *ld_so_in_runtime = pv_capture_output ( - (const char * const *) temp_bwrap->argv->pdata, NULL); + (const char * const *) temp_bwrap->argv->pdata, + (const char * const *) temp_bwrap->envp, NULL); } return TRUE; diff --git a/pressure-vessel/utils.c b/pressure-vessel/utils.c index ba28e4c13517d6b188c4e9b40252dd8b21ba3fc3..5cb4950d666a27aa21d0f30a3ae0c9229a415895 100644 --- a/pressure-vessel/utils.c +++ b/pressure-vessel/utils.c @@ -170,6 +170,7 @@ pv_search_path_append (GString *search_path, gchar * pv_capture_output (const char * const * argv, + const char * const * envp, GError **error) { gsize len; @@ -199,7 +200,7 @@ pv_capture_output (const char * const * argv, * that are not close-on-execute will get leaked into the child. */ if (!g_spawn_sync (NULL, /* cwd */ (char **) argv, - NULL, /* env */ + (char **) envp, (G_SPAWN_SEARCH_PATH | G_SPAWN_LEAVE_DESCRIPTORS_OPEN), NULL, NULL, diff --git a/pressure-vessel/utils.h b/pressure-vessel/utils.h index d15b52af35126965e27a740b9b6f0c281b3cecc8..5d647afa0e79652e3ac90594aacc132a561e6daa 100644 --- a/pressure-vessel/utils.h +++ b/pressure-vessel/utils.h @@ -49,6 +49,7 @@ void pv_search_path_append (GString *search_path, const gchar *item); gchar *pv_capture_output (const char * const * argv, + const char * const * envp, GError **error); gpointer pv_hash_table_get_arbitrary_key (GHashTable *table); diff --git a/tests/pressure-vessel/utils.c b/tests/pressure-vessel/utils.c index 3376ff50397073c3581a6764f6e67b0224cc8518..5508fb04f3dd20cd1f6c1ba99873eca932aaeed4 100644 --- a/tests/pressure-vessel/utils.c +++ b/tests/pressure-vessel/utils.c @@ -87,24 +87,25 @@ test_capture_output (Fixture *f, { const gchar * argv[] = { - "printf", "hello\\n", NULL + "printf", "hello\\n", NULL, NULL, }; g_autofree gchar *output = NULL; g_autoptr(GError) error = NULL; + g_auto(GStrv) envp = g_get_environ (); - output = pv_capture_output (argv, &error); + output = pv_capture_output (argv, NULL, &error); g_assert_cmpstr (output, ==, "hello"); g_assert_no_error (error); g_clear_pointer (&output, g_free); argv[1] = "hello\\nworld"; /* deliberately no trailing newline */ - output = pv_capture_output (argv, &error); + output = pv_capture_output (argv, NULL, &error); g_assert_no_error (error); g_assert_cmpstr (output, ==, "hello\nworld"); g_clear_pointer (&output, g_free); argv[0] = "/nonexistent/doesnotexist"; - output = pv_capture_output (argv, &error); + output = pv_capture_output (argv, NULL, &error); g_assert_nonnull (error); if (error->domain == G_SPAWN_ERROR @@ -129,10 +130,36 @@ test_capture_output (Fixture *f, argv[0] = "false"; argv[1] = NULL; - output = pv_capture_output (argv, &error); + output = pv_capture_output (argv, NULL, &error); g_assert_error (error, G_SPAWN_EXIT_ERROR, 1); g_assert_cmpstr (output, ==, NULL); g_clear_error (&error); + + argv[0] = "sh"; + argv[1] = "-euc"; + argv[2] = "echo \"$PATH\""; + output = pv_capture_output (argv, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (output, ==, g_getenv ("PATH")); + g_clear_pointer (&output, g_free); + + envp = g_environ_setenv (envp, "FOO", "bar", TRUE); + argv[0] = "sh"; + argv[1] = "-euc"; + argv[2] = "echo \"${FOO-unset}\""; + output = pv_capture_output (argv, (const char * const *) envp, &error); + g_assert_no_error (error); + g_assert_cmpstr (output, ==, "bar"); + g_clear_pointer (&output, g_free); + + envp = g_environ_unsetenv (envp, "FOO"); + argv[0] = "sh"; + argv[1] = "-euc"; + argv[2] = "echo \"${FOO-unset}\""; + output = pv_capture_output (argv, (const char * const *) envp, &error); + g_assert_no_error (error); + g_assert_cmpstr (output, ==, "unset"); + g_clear_pointer (&output, g_free); } static void