mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 01:58:54 +01:00 
			
		
		
		
	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.
This commit is contained in:
		@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user