diff options
author | Michael Catanzaro <mcatanzaro@redhat.com> | 2021-12-14 13:36:29 -0600 |
---|---|---|
committer | Michael Catanzaro <mcatanzaro@redhat.com> | 2021-12-14 13:45:39 -0600 |
commit | 2a7547f8a53974d640e99f2657b32d6ab73f26b3 (patch) | |
tree | db1f399efb0c13772e99e66e8d7b56e71f1e6272 | |
parent | 7d5bdff6d928deba2f9a999a85027f6517d08f55 (diff) | |
download | glib-2a7547f8a53974d640e99f2657b32d6ab73f26b3.tar.gz |
gsubprocess: ensure we test fd remapping on the posix_spawn() codepath
We should run test_pass_fd twice, once using gspawn's fork/exec codepath
and once attempting to use its posix_spawn() codepath. There's no
guarantee we'll actually get the posix_spawn() codepath, but it works
for now on Linux.
For good measure, run it a third time with no flags at all.
This causes the test to fail if I separately break the fd remapping
implementation. Without this, we fail to test fd remapping on the
posix_spawn() codepath.
-rw-r--r-- | gio/tests/gsubprocess.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/gio/tests/gsubprocess.c b/gio/tests/gsubprocess.c index 95ee3ac77..06affa967 100644 --- a/gio/tests/gsubprocess.c +++ b/gio/tests/gsubprocess.c @@ -1723,7 +1723,8 @@ test_child_setup (void) } static void -test_pass_fd (void) +do_test_pass_fd (GSubprocessFlags flags, + GSpawnChildSetupFunc child_setup) { GError *local_error = NULL; GError **error = &local_error; @@ -1748,9 +1749,11 @@ test_pass_fd (void) needdup_fd_str = g_strdup_printf ("%d", needdup_pipefds[1] + 1); args = get_test_subprocess_args ("write-to-fds", basic_fd_str, needdup_fd_str, NULL); - launcher = g_subprocess_launcher_new (G_SUBPROCESS_FLAGS_NONE); + launcher = g_subprocess_launcher_new (flags); g_subprocess_launcher_take_fd (launcher, basic_pipefds[1], basic_pipefds[1]); g_subprocess_launcher_take_fd (launcher, needdup_pipefds[1], needdup_pipefds[1] + 1); + if (child_setup != NULL) + g_subprocess_launcher_set_child_setup (launcher, child_setup, NULL, NULL); proc = g_subprocess_launcher_spawnv (launcher, (const gchar * const *) args->pdata, error); g_ptr_array_free (args, TRUE); g_assert_no_error (local_error); @@ -1780,6 +1783,39 @@ test_pass_fd (void) g_object_unref (proc); } +static void +test_pass_fd (void) +{ + do_test_pass_fd (G_SUBPROCESS_FLAGS_NONE, NULL); +} + +static void +empty_child_setup (gpointer user_data) +{ +} + +static void +test_pass_fd_empty_child_setup (void) +{ + /* Using a child setup function forces gspawn to use fork/exec + * rather than posix_spawn. + */ + do_test_pass_fd (G_SUBPROCESS_FLAGS_NONE, empty_child_setup); +} + +static void +test_pass_fd_inherit_fds (void) +{ + /* Try to test the optimized posix_spawn codepath instead of + * fork/exec. Currently this requires using INHERIT_FDS since gspawn's + * posix_spawn codepath does not currently handle closing + * non-inherited fds. Note that using INHERIT_FDS means our testing of + * g_subprocess_launcher_take_fd() is less-comprehensive than when + * using G_SUBPROCESS_FLAGS_NONE. + */ + do_test_pass_fd (G_SUBPROCESS_FLAGS_INHERIT_FDS, NULL); +} + #endif static void @@ -1917,7 +1953,9 @@ main (int argc, char **argv) g_test_add_func ("/gsubprocess/stdout-file", test_stdout_file); g_test_add_func ("/gsubprocess/stdout-fd", test_stdout_fd); g_test_add_func ("/gsubprocess/child-setup", test_child_setup); - g_test_add_func ("/gsubprocess/pass-fd", test_pass_fd); + g_test_add_func ("/gsubprocess/pass-fd/basic", test_pass_fd); + g_test_add_func ("/gsubprocess/pass-fd/empty-child-setup", test_pass_fd_empty_child_setup); + g_test_add_func ("/gsubprocess/pass-fd/inherit-fds", test_pass_fd_inherit_fds); #endif g_test_add_func ("/gsubprocess/launcher-environment", test_launcher_environment); |