diff options
author | Scott James Remnant <scott@ubuntu.com> | 2009-05-11 22:38:23 +0100 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2009-07-14 15:36:03 -0400 |
commit | dd63302d72fdb7276fce5c1edbc480af49bdf246 (patch) | |
tree | cbafc2eb9812da2bb02a28eaa3a41d72d71400fc /dbus | |
parent | 6eddb6e1229b617ad44c8d61107983229dc7d589 (diff) |
Make sure a pending call timeout isn't assumed.
* dbus/dbus-connection.c (_dbus_connection_attach_pending_call_unlocked):
Don't assume that the pending call has a timeout.
(connection_timeout_and_complete_all_pending_call_unlocked): check that
the timeout was actually added before removing it; this safeguards us
if the pending call doesn't have a timeout.
Signed-off-by: Scott James Remnant <scott@ubuntu.com>
(cherry picked from commit ba22606c3b21c55c5c0af30d8f07edd71ded7213)
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-connection.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 947c0afe..2530ad6a 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -883,21 +883,34 @@ _dbus_connection_attach_pending_call_unlocked (DBusConnection *connection, timeout = _dbus_pending_call_get_timeout_unlocked (pending); - if (!_dbus_connection_add_timeout_unlocked (connection, timeout)) - return FALSE; - - if (!_dbus_hash_table_insert_int (connection->pending_replies, - reply_serial, - pending)) + if (timeout) { - _dbus_connection_remove_timeout_unlocked (connection, timeout); + if (!_dbus_connection_add_timeout_unlocked (connection, timeout)) + return FALSE; + + if (!_dbus_hash_table_insert_int (connection->pending_replies, + reply_serial, + pending)) + { + _dbus_connection_remove_timeout_unlocked (connection, timeout); - _dbus_pending_call_set_timeout_added_unlocked (pending, FALSE); - HAVE_LOCK_CHECK (connection); - return FALSE; + _dbus_pending_call_set_timeout_added_unlocked (pending, FALSE); + HAVE_LOCK_CHECK (connection); + return FALSE; + } + + _dbus_pending_call_set_timeout_added_unlocked (pending, TRUE); + } + else + { + if (!_dbus_hash_table_insert_int (connection->pending_replies, + reply_serial, + pending)) + { + HAVE_LOCK_CHECK (connection); + return FALSE; + } } - - _dbus_pending_call_set_timeout_added_unlocked (pending, TRUE); _dbus_pending_call_ref_unlocked (pending); @@ -2188,8 +2201,10 @@ connection_timeout_and_complete_all_pending_calls_unlocked (DBusConnection *conn _dbus_pending_call_queue_timeout_error_unlocked (pending, connection); - _dbus_connection_remove_timeout_unlocked (connection, - _dbus_pending_call_get_timeout_unlocked (pending)); + + if (_dbus_pending_call_is_timeout_added_unlocked (pending)) + _dbus_connection_remove_timeout_unlocked (connection, + _dbus_pending_call_get_timeout_unlocked (pending)); _dbus_pending_call_set_timeout_added_unlocked (pending, FALSE); _dbus_hash_iter_remove_entry (&iter); |