From 65ea5bde8e0588f8019f3bb4e0f50a2a7c73c127 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 16 Aug 2023 16:24:26 +0100 Subject: [PATCH] gdbusconnection: Add some assertions about required message fields The fields are fully validated in `validate_headers()` in `gdbusmessage.c` now, so the connection code should be able to rely on the required ones being non-`NULL`. Signed-off-by: Philip Withnall Helps: #3061 --- gio/gdbusconnection.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c index bc3c067dc..1ee2ab44f 100644 --- a/gio/gdbusconnection.c +++ b/gio/gdbusconnection.c @@ -3966,10 +3966,22 @@ distribute_signals (GDBusConnection *connection, GDBusMessage *message) { GPtrArray *signal_data_array; - const gchar *sender; + const gchar *sender, *interface, *member, *path; + + g_assert (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_SIGNAL); sender = g_dbus_message_get_sender (message); + /* all three of these are required, but should have been validated already + * by validate_headers() in gdbusmessage.c */ + interface = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + path = g_dbus_message_get_path (message); + + g_assert (interface != NULL); + g_assert (member != NULL); + g_assert (path != NULL); + if (G_UNLIKELY (_g_dbus_debug_signal ())) { _g_dbus_debug_print_lock (); @@ -3978,9 +3990,7 @@ distribute_signals (GDBusConnection *connection, " <<<< RECEIVED SIGNAL %s.%s\n" " on object %s\n" " sent by name %s\n", - g_dbus_message_get_interface (message), - g_dbus_message_get_member (message), - g_dbus_message_get_path (message), + interface, member, path, sender != NULL ? sender : "(none)"); _g_dbus_debug_print_unlock (); } @@ -7195,9 +7205,17 @@ distribute_method_call (GDBusConnection *connection, g_assert (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL); - interface_name = g_dbus_message_get_interface (message); + /* these are required, and should have been validated by validate_headers() + * in gdbusmessage.c already */ member = g_dbus_message_get_member (message); path = g_dbus_message_get_path (message); + + g_assert (member != NULL); + g_assert (path != NULL); + + /* this is optional */ + interface_name = g_dbus_message_get_interface (message); + subtree_path = g_strdup (path); needle = strrchr (subtree_path, '/'); if (needle != NULL && needle != subtree_path) @@ -7210,7 +7228,6 @@ distribute_method_call (GDBusConnection *connection, subtree_path = NULL; } - if (G_UNLIKELY (_g_dbus_debug_incoming ())) { _g_dbus_debug_print_lock ();