mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-23 02:32:11 +01:00
gio/subprocess: Initialize pid variable to 0
The documentation for g_spawn_async_with_pipes_and_fds() states: > If an error occurs, child_pid, stdin_pipe_out, stdout_pipe_out, and > stderr_pipe_out will not be filled with valid values. Before 2dc3a6f0c80e5a8f786369eee0c45bfe19b55f4f, the `child_pid` argument was `self->pid`, and GObject zero-initializes structs. So the pid field was properly initialized to zero. After 2dc3a6f0c80e5a8f786369eee0c45bfe19b55f4f, however, the out variable is now declared inside initable_init(), and it's unitialized. So if g_spawn_async_with_pipes_and_fds() errors out, `pid` will have trash value in it, and the following assertion will fail: ``` g_assert (success == (pid != 0)); ``` Fix that by initializing the `pid` variable to zero. Add a test to exercise the fail code path, and prevent errors like this in the future.
This commit is contained in:
parent
c5d82f9099
commit
14909ffe1e
@ -305,7 +305,7 @@ initable_init (GInitable *initable,
|
|||||||
gint *pipe_ptrs[3] = { NULL, NULL, NULL };
|
gint *pipe_ptrs[3] = { NULL, NULL, NULL };
|
||||||
gint pipe_fds[3] = { -1, -1, -1 };
|
gint pipe_fds[3] = { -1, -1, -1 };
|
||||||
gint close_fds[3] = { -1, -1, -1 };
|
gint close_fds[3] = { -1, -1, -1 };
|
||||||
GPid pid;
|
GPid pid = 0;
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
gint stdin_fd = -1, stdout_fd = -1, stderr_fd = -1;
|
gint stdin_fd = -1, stdout_fd = -1, stderr_fd = -1;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1352,6 +1352,22 @@ test_terminate (void)
|
|||||||
g_object_unref (proc);
|
g_object_unref (proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_fail_initialization (void)
|
||||||
|
{
|
||||||
|
GError *local_error = NULL;
|
||||||
|
GError **error = &local_error;
|
||||||
|
GSubprocess *proc;
|
||||||
|
|
||||||
|
proc = g_subprocess_new (G_SUBPROCESS_FLAGS_NONE,
|
||||||
|
error,
|
||||||
|
"thisprogramshouldnotexistprettyplease",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_assert_null (proc);
|
||||||
|
g_assert_error (local_error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
static void
|
static void
|
||||||
send_signal (gpointer user_data)
|
send_signal (gpointer user_data)
|
||||||
@ -2244,6 +2260,7 @@ main (int argc, char **argv)
|
|||||||
g_test_add_func ("/gsubprocess/communicate/utf8/invalid", test_communicate_utf8_invalid);
|
g_test_add_func ("/gsubprocess/communicate/utf8/invalid", test_communicate_utf8_invalid);
|
||||||
g_test_add_func ("/gsubprocess/communicate/nothing", test_communicate_nothing);
|
g_test_add_func ("/gsubprocess/communicate/nothing", test_communicate_nothing);
|
||||||
g_test_add_func ("/gsubprocess/terminate", test_terminate);
|
g_test_add_func ("/gsubprocess/terminate", test_terminate);
|
||||||
|
g_test_add_func ("/gsubprocess/fail-initialization", test_fail_initialization);
|
||||||
g_test_add_func ("/gsubprocess/env", test_env);
|
g_test_add_func ("/gsubprocess/env", test_env);
|
||||||
g_test_add_func ("/gsubprocess/env/inherit", test_env_inherit);
|
g_test_add_func ("/gsubprocess/env/inherit", test_env_inherit);
|
||||||
g_test_add_func ("/gsubprocess/cwd", test_cwd);
|
g_test_add_func ("/gsubprocess/cwd", test_cwd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user