From 98ad8a8ec6626f7f5c78915b6bdf2be688b4839f Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Sun, 30 Jan 2005 07:44:08 +0000 Subject: 2005-01-30 Havoc Pennington * glib/dbus-gobject.c (introspect_properties): fix the XML generated * dbus/dbus-message.c (dbus_message_unref): add an in_cache flag which effectively detects the use of freed messages * glib/dbus-gobject.c (handle_introspect): modify and return the reply message instead of the incoming message * dbus/dbus-object-tree.c (handle_default_introspect_unlocked): gee, maybe it should SEND THE XML instead of just making a string and freeing it again ;-) * tools/dbus-print-message.c (print_message): improve printing of messages * configure.in: add debug-glib.service to the output --- dbus/dbus-connection-internal.h | 4 +++- dbus/dbus-connection.c | 13 ++++++++++--- dbus/dbus-marshal-validate.c | 4 ++++ dbus/dbus-message-private.h | 4 ++++ dbus/dbus-message.c | 14 +++++++++++++- dbus/dbus-object-tree.c | 30 ++++++++++++++++++++++++++++++ 6 files changed, 64 insertions(+), 5 deletions(-) (limited to 'dbus') diff --git a/dbus/dbus-connection-internal.h b/dbus/dbus-connection-internal.h index b5781d9c..14184ad2 100644 --- a/dbus/dbus-connection-internal.h +++ b/dbus/dbus-connection-internal.h @@ -89,7 +89,9 @@ DBusMessage* _dbus_connection_block_for_reply (DBusConnection int timeout_milliseconds); void _dbus_pending_call_complete_and_unlock (DBusPendingCall *pending, DBusMessage *message); - +dbus_bool_t _dbus_connection_send_unlocked (DBusConnection *connection, + DBusMessage *message, + dbus_uint32_t *client_serial); /** * @addtogroup DBusPendingCallInternals DBusPendingCall implementation details diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 90d7c38b..f01133c5 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -357,7 +357,7 @@ _dbus_connection_queue_received_message_link (DBusConnection *connection, _dbus_connection_wakeup_mainloop (connection); - _dbus_verbose ("Message %p (%d %s %s '%s') added to incoming queue %p, %d incoming\n", + _dbus_verbose ("Message %p (%d %s %s '%s' reply to %u) added to incoming queue %p, %d incoming\n", message, dbus_message_get_type (message), dbus_message_get_interface (message) ? @@ -367,6 +367,7 @@ _dbus_connection_queue_received_message_link (DBusConnection *connection, dbus_message_get_member (message) : "no member", dbus_message_get_signature (message), + dbus_message_get_reply_serial (message), connection, connection->n_incoming); } @@ -1562,7 +1563,7 @@ _dbus_connection_send_preallocated_unlocked (DBusConnection *connection, sig = dbus_message_get_signature (message); - _dbus_verbose ("Message %p (%d %s %s '%s') added to outgoing queue %p, %d pending to send\n", + _dbus_verbose ("Message %p (%d %s %s '%s') for %s added to outgoing queue %p, %d pending to send\n", message, dbus_message_get_type (message), dbus_message_get_interface (message) ? @@ -1572,6 +1573,9 @@ _dbus_connection_send_preallocated_unlocked (DBusConnection *connection, dbus_message_get_member (message) : "no member", sig, + dbus_message_get_destination (message) ? + dbus_message_get_destination (message) : + "null", connection, connection->n_outgoing); @@ -1587,6 +1591,9 @@ _dbus_connection_send_preallocated_unlocked (DBusConnection *connection, if (client_serial) *client_serial = dbus_message_get_serial (message); } + + _dbus_verbose ("Message %p serial is %u\n", + message, dbus_message_get_serial (message)); _dbus_message_lock (message); @@ -1638,7 +1645,7 @@ dbus_connection_send_preallocated (DBusConnection *connection, CONNECTION_UNLOCK (connection); } -static dbus_bool_t +dbus_bool_t _dbus_connection_send_unlocked (DBusConnection *connection, DBusMessage *message, dbus_uint32_t *client_serial) diff --git a/dbus/dbus-marshal-validate.c b/dbus/dbus-marshal-validate.c index d9b85cb7..b144b62a 100644 --- a/dbus/dbus-marshal-validate.c +++ b/dbus/dbus-marshal-validate.c @@ -178,9 +178,11 @@ validate_body_helper (DBusTypeReader *reader, const unsigned char *a; int alignment; +#if 0 _dbus_verbose (" validating value of type %s type reader %p type_pos %d p %p end %p %d remain\n", _dbus_type_to_string (current_type), reader, reader->type_pos, p, end, (int) (end - p)); +#endif /* Guarantee that p has one byte to look at */ if (p == end) @@ -436,9 +438,11 @@ validate_body_helper (DBusTypeReader *reader, break; } +#if 0 _dbus_verbose (" validated value of type %s type reader %p type_pos %d p %p end %p %d remain\n", _dbus_type_to_string (current_type), reader, reader->type_pos, p, end, (int) (end - p)); +#endif if (p > end) { diff --git a/dbus/dbus-message-private.h b/dbus/dbus-message-private.h index 5f727ae1..9ba5c2f4 100644 --- a/dbus/dbus-message-private.h +++ b/dbus/dbus-message-private.h @@ -97,6 +97,10 @@ struct DBusMessage unsigned int locked : 1; /**< Message being sent, no modifications allowed. */ +#ifndef DBUS_DISABLE_CHECKS + unsigned int in_cache : 1; /**< Has been "freed" since it's in the cache (this is a debug feature) */ +#endif + DBusList *size_counters; /**< 0-N DBusCounter used to track message size. */ long size_counter_delta; /**< Size we incremented the size counters by. */ diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index 85252005..0d816595 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -456,6 +456,8 @@ dbus_message_finalize (DBusMessage *message) _dbus_header_free (&message->header); _dbus_string_free (&message->body); + _dbus_assert (message->refcount.value == 0); + dbus_free (message); } @@ -657,10 +659,15 @@ dbus_message_cache_or_finalize (DBusMessage *message) message_cache[i] = message; message_cache_count += 1; was_cached = TRUE; +#ifndef DBUS_DISABLE_CHECKS + message->in_cache = TRUE; +#endif out: _DBUS_UNLOCK (message_cache); + _dbus_assert (message->refcount.value == 0); + if (!was_cached) dbus_message_finalize (message); } @@ -691,6 +698,9 @@ dbus_message_new_empty_header (void) message->refcount.value = 1; message->byte_order = DBUS_COMPILER_BYTE_ORDER; message->locked = FALSE; +#ifndef DBUS_DISABLE_CHECKS + message->in_cache = FALSE; +#endif message->size_counters = NULL; message->size_counter_delta = 0; message->changed_stamp = 0; @@ -1067,7 +1077,8 @@ dbus_message_ref (DBusMessage *message) _dbus_return_val_if_fail (message != NULL, NULL); _dbus_return_val_if_fail (message->generation == _dbus_current_generation, NULL); - + _dbus_return_val_if_fail (!message->in_cache, NULL); + old_refcount = _dbus_atomic_inc (&message->refcount); _dbus_assert (old_refcount >= 1); @@ -1087,6 +1098,7 @@ dbus_message_unref (DBusMessage *message) _dbus_return_if_fail (message != NULL); _dbus_return_if_fail (message->generation == _dbus_current_generation); + _dbus_return_if_fail (!message->in_cache); old_refcount = _dbus_atomic_dec (&message->refcount); diff --git a/dbus/dbus-object-tree.c b/dbus/dbus-object-tree.c index f8797595..da8d8c26 100644 --- a/dbus/dbus-object-tree.c +++ b/dbus/dbus-object-tree.c @@ -615,11 +615,22 @@ handle_default_introspect_unlocked (DBusObjectTree *tree, DBusHandlerResult result; char **children; int i; + DBusMessage *reply; + DBusMessageIter iter; + const char *v_STRING; + /* We have the connection lock here */ + + _dbus_verbose (" considering default Introspect() handler...\n"); + + reply = NULL; + if (!dbus_message_is_method_call (message, DBUS_INTERFACE_ORG_FREEDESKTOP_INTROSPECTABLE, "Introspect")) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + _dbus_verbose (" using default Introspect() handler!\n"); if (!_dbus_string_init (&xml)) return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -648,12 +659,31 @@ handle_default_introspect_unlocked (DBusObjectTree *tree, if (!_dbus_string_append (&xml, "\n")) goto out; + + reply = dbus_message_new_method_return (message); + if (reply == NULL) + goto out; + + dbus_message_iter_init_append (reply, &iter); + v_STRING = _dbus_string_get_const_data (&xml); + if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &v_STRING)) + goto out; + +#ifdef DBUS_BUILD_TESTS + if (tree->connection) +#endif + { + if (!_dbus_connection_send_unlocked (tree->connection, reply, NULL)) + goto out; + } result = DBUS_HANDLER_RESULT_HANDLED; out: _dbus_string_free (&xml); dbus_free_string_array (children); + if (reply) + dbus_message_unref (reply); return result; } -- cgit