From c1d8b9c806427f75c4707e1634d2e2565b6fe733 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 27 Jun 2018 09:51:12 +0100 Subject: gbufferedoutputstream: Fix jump conditional on uninitialised data The flush data structures were not zero-initialised, which meant the branch in flush_buffer_thread() was based on an uninitialised condition. Signed-off-by: Philip Withnall --- gio/gbufferedoutputstream.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'gio') diff --git a/gio/gbufferedoutputstream.c b/gio/gbufferedoutputstream.c index 8b2bcdc04..98bda501d 100644 --- a/gio/gbufferedoutputstream.c +++ b/gio/gbufferedoutputstream.c @@ -699,7 +699,7 @@ g_buffered_output_stream_flush_async (GOutputStream *stream, GTask *task; FlushData *fdata; - fdata = g_slice_new (FlushData); + fdata = g_slice_new0 (FlushData); fdata->flush_stream = TRUE; fdata->close_stream = FALSE; @@ -732,7 +732,7 @@ g_buffered_output_stream_close_async (GOutputStream *stream, GTask *task; FlushData *fdata; - fdata = g_slice_new (FlushData); + fdata = g_slice_new0 (FlushData); fdata->close_stream = TRUE; task = g_task_new (stream, cancellable, callback, data); -- cgit v1.2.1 From 6db2412b41ebd6d61b5c6dac49adaf3b324d4ca0 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 27 Jun 2018 09:52:33 +0100 Subject: gdesktopappinfo: Fix a minor command line leak Signed-off-by: Philip Withnall --- gio/gdesktopappinfo.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'gio') diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index 617a096fb..d0ffbace3 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -4698,6 +4698,8 @@ g_desktop_app_info_launch_action (GDesktopAppInfo *info, g_desktop_app_info_launch_uris_with_spawn (info, session_bus, exec_line, NULL, launch_context, _SPAWN_FLAGS_DEFAULT, NULL, NULL, NULL, NULL, -1, -1, -1, NULL); + + g_free (exec_line); } if (session_bus != NULL) -- cgit v1.2.1 From 61da8748fdfb1a86b3a0493bbc0dd03ff17dcb22 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 27 Jun 2018 09:53:26 +0100 Subject: glocalfile: Fix a minor memory leak Signed-off-by: Philip Withnall --- gio/glocalfile.c | 1 + 1 file changed, 1 insertion(+) (limited to 'gio') diff --git a/gio/glocalfile.c b/gio/glocalfile.c index 1c8fa42e8..83dff4342 100644 --- a/gio/glocalfile.c +++ b/gio/glocalfile.c @@ -1807,6 +1807,7 @@ _g_local_file_has_trash_dir (const char *dirname, dev_t dir_dev) if (mount == NULL || g_unix_mount_is_system_internal (mount)) { g_clear_pointer (&mount, g_unix_mount_free); + g_free (topdir); return FALSE; } -- cgit v1.2.1 From 68526565f41383f2c588951bf7e4de7a7ea4c162 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 27 Jun 2018 09:54:06 +0100 Subject: tests: Fix use-after-free in the appinfo tests When changing the locale using setlocale(), duplicate the old locale value before updating it, so that we can safely restore the old locale after running the test. Signed-off-by: Philip Withnall --- gio/tests/appinfo.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'gio') diff --git a/gio/tests/appinfo.c b/gio/tests/appinfo.c index 2e69da051..d9d61b605 100644 --- a/gio/tests/appinfo.c +++ b/gio/tests/appinfo.c @@ -128,10 +128,10 @@ static void test_locale (const char *locale) { GAppInfo *appinfo; - const gchar *orig; + gchar *orig = NULL; const gchar *path; - orig = setlocale (LC_ALL, NULL); + orig = g_strdup (setlocale (LC_ALL, NULL)); g_setenv ("LANGUAGE", locale, TRUE); setlocale (LC_ALL, ""); @@ -161,6 +161,7 @@ test_locale (const char *locale) g_setenv ("LANGUAGE", orig, TRUE); setlocale (LC_ALL, ""); + g_free (orig); } static void -- cgit v1.2.1 From 93b519b104802250ad2f61f9a67fa5c236ef036b Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 27 Jun 2018 09:57:21 +0100 Subject: tests: Various minor leak fixes in the GIO tests Signed-off-by: Philip Withnall --- gio/tests/appinfo.c | 1 + gio/tests/dbus-appinfo.c | 9 ++++++--- gio/tests/desktop-app-info.c | 9 +++++++++ gio/tests/g-file-info-filesystem-readonly.c | 2 ++ gio/tests/gdbus-peer-object-manager.c | 2 ++ gio/tests/gdbus-peer.c | 4 ++++ gio/tests/resources.c | 4 +++- gio/tests/simple-proxy.c | 1 + gio/tests/task.c | 1 + gio/tests/unix-streams.c | 2 ++ 10 files changed, 31 insertions(+), 4 deletions(-) (limited to 'gio') diff --git a/gio/tests/appinfo.c b/gio/tests/appinfo.c index d9d61b605..ea4809d54 100644 --- a/gio/tests/appinfo.c +++ b/gio/tests/appinfo.c @@ -381,6 +381,7 @@ test_associations (void) "cmdline-app-test", G_APP_INFO_CREATE_SUPPORTS_URIS, NULL); + g_free (cmdline); error = NULL; result = g_app_info_set_as_default_for_type (appinfo, "application/x-glib-test", &error); diff --git a/gio/tests/dbus-appinfo.c b/gio/tests/dbus-appinfo.c index ee73d5833..8961a5495 100644 --- a/gio/tests/dbus-appinfo.c +++ b/gio/tests/dbus-appinfo.c @@ -254,11 +254,14 @@ test_dbus_appinfo (void) const gchar *argv[] = { "myapp", NULL }; TestApplication *app; int status; + gchar *desktop_file = NULL; - appinfo = g_desktop_app_info_new_from_filename (g_test_build_filename (G_TEST_DIST, - "org.gtk.test.dbusappinfo.desktop", - NULL)); + desktop_file = g_test_build_filename (G_TEST_DIST, + "org.gtk.test.dbusappinfo.desktop", + NULL); + appinfo = g_desktop_app_info_new_from_filename (desktop_file); g_assert (appinfo != NULL); + g_free (desktop_file); app = g_object_new (test_application_get_type (), "application-id", "org.gtk.test.dbusappinfo", diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c index 639b27e18..4871d85a5 100644 --- a/gio/tests/desktop-app-info.c +++ b/gio/tests/desktop-app-info.c @@ -93,6 +93,8 @@ test_delete (void) res = g_app_info_delete (info); g_assert (!res); } + + g_free (filename); } static void @@ -115,6 +117,7 @@ test_default (void) info = g_app_info_get_default_for_type ("application/x-test", FALSE); g_assert (info != NULL); g_assert_cmpstr (g_app_info_get_id (info), ==, g_app_info_get_id (info2)); + g_object_unref (info); /* now try adding something, but not setting as default */ g_app_info_add_supports_type (info3, "application/x-test", &error); @@ -124,6 +127,7 @@ test_default (void) info = g_app_info_get_default_for_type ("application/x-test", FALSE); g_assert (info != NULL); g_assert_cmpstr (g_app_info_get_id (info), ==, g_app_info_get_id (info2)); + g_object_unref (info); /* now remove info1 again */ g_app_info_remove_supports_type (info1, "application/x-test", &error); @@ -133,6 +137,7 @@ test_default (void) info = g_app_info_get_default_for_type ("application/x-test", FALSE); g_assert (info != NULL); g_assert_cmpstr (g_app_info_get_id (info), ==, g_app_info_get_id (info2)); + g_object_unref (info); /* now clean it all up */ g_app_info_reset_type_associations ("application/x-test"); @@ -146,6 +151,7 @@ test_default (void) g_object_unref (info1); g_object_unref (info2); + g_object_unref (info3); } static void @@ -324,6 +330,8 @@ cleanup_dir_recurse (GFile *parent, ret = TRUE; out: + g_clear_object (&enumerator); + return ret; } @@ -342,6 +350,7 @@ cleanup_subdirs (const char *base_dir) (void) cleanup_dir_recurse (file, file, &error); g_assert_no_error (error); g_object_unref (file); + g_object_unref (base); } static void diff --git a/gio/tests/g-file-info-filesystem-readonly.c b/gio/tests/g-file-info-filesystem-readonly.c index c2b0aa518..123dcd8a0 100644 --- a/gio/tests/g-file-info-filesystem-readonly.c +++ b/gio/tests/g-file-info-filesystem-readonly.c @@ -45,6 +45,8 @@ test_filesystem_readonly (gconstpointer with_mount_monitor) { /* We need these because "mount --bind" requires root privileges */ g_test_skip ("'bindfs' and 'fusermount' commands are needed to run this test"); + g_free (fusermount); + g_free (bindfs); return; } diff --git a/gio/tests/gdbus-peer-object-manager.c b/gio/tests/gdbus-peer-object-manager.c index 933cc529d..676c9f080 100644 --- a/gio/tests/gdbus-peer-object-manager.c +++ b/gio/tests/gdbus-peer-object-manager.c @@ -258,6 +258,8 @@ setup (Test *test, g_assert (test->server); g_assert (test->client); + + g_object_unref (stream); } static void diff --git a/gio/tests/gdbus-peer.c b/gio/tests/gdbus-peer.c index 101c2a8bb..7f35baae6 100644 --- a/gio/tests/gdbus-peer.c +++ b/gio/tests/gdbus-peer.c @@ -875,6 +875,7 @@ test_peer (void) getuid ()); g_assert_cmpuint (g_credentials_get_unix_pid (credentials, NULL), ==, getpid ()); + g_object_unref (credentials); #else g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); g_assert (credentials == NULL); @@ -1358,6 +1359,8 @@ test_nonce_tcp (void) g_main_loop_quit (service_loop); g_thread_join (service_thread); + + g_ptr_array_unref (data.current_connections); } static void @@ -1711,6 +1714,7 @@ codegen_test_peer (void) * change notifications anyway because those are done from an idle handler */ example_animal_call_poke_sync (animal2, TRUE, TRUE, NULL, &error); + g_clear_error (&error); g_object_unref (animal1); g_object_unref (animal2); diff --git a/gio/tests/resources.c b/gio/tests/resources.c index 8163aa141..5d2e27474 100644 --- a/gio/tests/resources.c +++ b/gio/tests/resources.c @@ -547,7 +547,8 @@ test_uri_query_info (void) GBytes *data; GFile *file; GFileInfo *info; - const char *content_type, *mime_type; + const char *content_type; + gchar *mime_type = NULL; const char *fs_type; gboolean readonly; @@ -573,6 +574,7 @@ test_uri_query_info (void) mime_type = g_content_type_get_mime_type (content_type); g_assert (mime_type); g_assert_cmpstr (mime_type, ==, "text/plain"); + g_free (mime_type); g_object_unref (info); diff --git a/gio/tests/simple-proxy.c b/gio/tests/simple-proxy.c index f1eb6af9b..ffc16eddd 100644 --- a/gio/tests/simple-proxy.c +++ b/gio/tests/simple-proxy.c @@ -77,6 +77,7 @@ test_uris (void) g_assert_cmpstr (error->message, ==, str); g_clear_error (&error); g_assert_null (proxies); + g_object_unref (result); g_object_unref (resolver); g_free (str); diff --git a/gio/tests/task.c b/gio/tests/task.c index 08d78e5ef..934262e40 100644 --- a/gio/tests/task.c +++ b/gio/tests/task.c @@ -1902,6 +1902,7 @@ legacy_error_callback (GObject *object, g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); *result_out = -2; + g_clear_error (&error); } else { diff --git a/gio/tests/unix-streams.c b/gio/tests/unix-streams.c index dafaf66aa..67a90d83d 100644 --- a/gio/tests/unix-streams.c +++ b/gio/tests/unix-streams.c @@ -178,6 +178,7 @@ main_thread_read (GObject *source, GAsyncResult *res, gpointer user_data) if (g_cancellable_is_cancelled (main_cancel)) { do_main_cancel (out); + g_clear_error (&err); return; } @@ -214,6 +215,7 @@ main_thread_wrote (GObject *source, GAsyncResult *res, gpointer user_data) if (g_cancellable_is_cancelled (main_cancel)) { do_main_cancel (out); + g_clear_error (&err); return; } -- cgit v1.2.1 From f7bd41fdaab6b5c65714c6b15335a6d1a855cecf Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 27 Jun 2018 09:57:37 +0100 Subject: tests: Fix leak when checking for du binary g_find_program_in_path() returns a pointer, not a boolean. Signed-off-by: Philip Withnall --- gio/tests/file.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'gio') diff --git a/gio/tests/file.c b/gio/tests/file.c index 9d5a6e8cd..d2f147419 100644 --- a/gio/tests/file.c +++ b/gio/tests/file.c @@ -913,6 +913,13 @@ get_size_from_du (const gchar *path, guint64 *size) gchar *result; gchar *endptr; GError *error = NULL; + gchar *du_path = NULL; + + /* If we can’t find du, don’t try and run the test. */ + du_path = g_find_program_in_path ("du"); + if (du_path == NULL) + return FALSE; + g_free (du_path); du = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE, &error, @@ -950,7 +957,7 @@ test_measure (void) path = g_test_build_filename (G_TEST_DIST, "desktop-files", NULL); file = g_file_new_for_path (path); - if (!g_find_program_in_path ("du") || !get_size_from_du (path, &size)) + if (!get_size_from_du (path, &size)) { g_test_message ("du not found or fail to run, skipping byte measurement"); size = 0; @@ -1052,8 +1059,7 @@ test_measure_async (void) path = g_test_build_filename (G_TEST_DIST, "desktop-files", NULL); file = g_file_new_for_path (path); - if (!g_find_program_in_path ("du") || - !get_size_from_du (path, &data->expected_bytes)) + if (!get_size_from_du (path, &data->expected_bytes)) { g_test_message ("du not found or fail to run, skipping byte measurement"); data->expected_bytes = 0; -- cgit v1.2.1