From 299bcbfa41db0093bc876c1095f0aab248e3b771 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Mon, 25 Nov 2013 13:35:53 +0000 Subject: [PATCH] gsubprocess: Fix potential strlen(NULL) calls Also clarify the nullability of stdin_buf arguments in GSubprocess communication calls. Found with scan-build. https://bugzilla.gnome.org/show_bug.cgi?id=715164 --- gio/gsubprocess.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/gio/gsubprocess.c b/gio/gsubprocess.c index bced7a5..e1ba088 100644 --- a/gio/gsubprocess.c +++ b/gio/gsubprocess.c @@ -1561,7 +1561,7 @@ g_subprocess_communicate_internal (GSubprocess *subprocess, /** * g_subprocess_communicate: * @subprocess: a #GSubprocess - * @stdin_buf: data to send to the stdin of the subprocess, or %NULL + * @stdin_buf: (allow-none): data to send to the stdin of the subprocess, or %NULL * @cancellable: a #GCancellable * @stdout_buf: (out): data read from the subprocess stdout * @stderr_buf: (out): data read from the subprocess stderr @@ -1570,7 +1570,7 @@ g_subprocess_communicate_internal (GSubprocess *subprocess, * Communicate with the subprocess until it terminates, and all input * and output has been completed. * - * If @stdin is given, the subprocess must have been created with + * If @stdin_buf is given, the subprocess must have been created with * %G_SUBPROCESS_FLAGS_STDIN_PIPE. The given data is fed to the * stdin of the subprocess and the pipe is closed (ie: EOF). * @@ -1642,8 +1642,8 @@ g_subprocess_communicate (GSubprocess *subprocess, /** * g_subprocess_communicate_async: * @subprocess: Self - * @stdin_buf: Input data - * @cancellable: Cancellable + * @stdin_buf: (allow-none): Input data, or %NULL + * @cancellable: (allow-none): Cancellable * @callback: Callback * @user_data: User data * @@ -1708,7 +1708,7 @@ g_subprocess_communicate_finish (GSubprocess *subprocess, /** * g_subprocess_communicate_utf8: * @subprocess: a #GSubprocess - * @stdin_buf: data to send to the stdin of the subprocess, or %NULL + * @stdin_buf: (allow-none): data to send to the stdin of the subprocess, or %NULL * @cancellable: a #GCancellable * @stdout_buf: (out): data read from the subprocess stdout * @stderr_buf: (out): data read from the subprocess stderr @@ -1728,13 +1728,16 @@ g_subprocess_communicate_utf8 (GSubprocess *subprocess, GAsyncResult *result = NULL; gboolean success; GBytes *stdin_bytes; + size_t stdin_buf_len = 0; g_return_val_if_fail (G_IS_SUBPROCESS (subprocess), FALSE); g_return_val_if_fail (stdin_buf == NULL || (subprocess->flags & G_SUBPROCESS_FLAGS_STDIN_PIPE), FALSE); g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - stdin_bytes = g_bytes_new (stdin_buf, strlen (stdin_buf)); + if (stdin_buf != NULL) + stdin_buf_len = strlen (stdin_buf); + stdin_bytes = g_bytes_new (stdin_buf, stdin_buf_len); g_subprocess_sync_setup (); g_subprocess_communicate_internal (subprocess, TRUE, stdin_bytes, cancellable, @@ -1750,7 +1753,7 @@ g_subprocess_communicate_utf8 (GSubprocess *subprocess, /** * g_subprocess_communicate_utf8_async: * @subprocess: Self - * @stdin_buf: Input data + * @stdin_buf: (allow-none): Input data, or %NULL * @cancellable: Cancellable * @callback: Callback * @user_data: User data @@ -1766,13 +1769,18 @@ g_subprocess_communicate_utf8_async (GSubprocess *subprocess, gpointer user_data) { GBytes *stdin_bytes; + size_t stdin_buf_len = 0; g_return_if_fail (G_IS_SUBPROCESS (subprocess)); g_return_if_fail (stdin_buf == NULL || (subprocess->flags & G_SUBPROCESS_FLAGS_STDIN_PIPE)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - stdin_bytes = g_bytes_new (stdin_buf, strlen (stdin_buf)); + if (stdin_buf != NULL) + stdin_buf_len = strlen (stdin_buf); + stdin_bytes = g_bytes_new (stdin_buf, stdin_buf_len); + g_subprocess_communicate_internal (subprocess, TRUE, stdin_bytes, cancellable, callback, user_data); + g_bytes_unref (stdin_bytes); } -- 2.7.4