From bebc830fc47cbf191f7518dfd0cd88c4938c2dbf Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Tue, 28 Oct 2003 23:51:24 +0000 Subject: 2003-10-28 Havoc Pennington * bus/expirelist.c (do_expiration_with_current_time): detect failure of the expire_func due to OOM * bus/connection.c (bus_pending_reply_expired): return FALSE on OOM * bus/dispatch.c (check_send_exit_to_service): fix to handle the NoReply error that's now created by the bus when the service exits --- bus/dispatch.c | 76 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 17 deletions(-) (limited to 'bus/dispatch.c') diff --git a/bus/dispatch.c b/bus/dispatch.c index 26dd4fc8..c5331915 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -415,16 +415,20 @@ warn_unexpected_real (DBusConnection *connection, const char *function, int line) { - _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n", - function, line, - dbus_message_get_interface (message) ? - dbus_message_get_interface (message) : "(unset)", - dbus_message_get_member (message) ? - dbus_message_get_member (message) : "(unset)", - dbus_message_get_error_name (message) ? - dbus_message_get_error_name (message) : "(unset)", - connection, - expected); + if (message) + _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n", + function, line, + dbus_message_get_interface (message) ? + dbus_message_get_interface (message) : "(unset)", + dbus_message_get_member (message) ? + dbus_message_get_member (message) : "(unset)", + dbus_message_get_error_name (message) ? + dbus_message_get_error_name (message) : "(unset)", + connection, + expected); + else + _dbus_warn ("%s:%d received no message on %p, expecting %s\n", + function, line, connection, expected); } #define warn_unexpected(connection, message, expected) \ @@ -1428,12 +1432,6 @@ check_service_deactivated (BusContext *context, if (csdd.failed) goto out; - - if (!check_no_leftovers (context)) - { - _dbus_warn ("Messages were left over after verifying results of service exiting\n"); - goto out; - } retval = TRUE; @@ -1519,6 +1517,13 @@ check_send_exit_to_service (BusContext *context, message = pop_message_waiting_for_memory (connection); _dbus_assert (message != NULL); + if (dbus_message_get_reply_serial (message) != serial) + { + warn_unexpected (connection, message, + "error with the correct reply serial"); + goto out; + } + if (!dbus_message_is_error (message, DBUS_ERROR_NO_MEMORY)) { @@ -1540,8 +1545,45 @@ check_send_exit_to_service (BusContext *context, if (!check_service_deactivated (context, connection, service_name, base_service)) goto out; - } + /* Should now have a NoReply error from the Exit() method + * call; it should have come after all the deactivation + * stuff. + */ + message = pop_message_waiting_for_memory (connection); + + if (message == NULL) + { + warn_unexpected (connection, NULL, + "reply to Exit() method call"); + goto out; + } + if (!dbus_message_is_error (message, + DBUS_ERROR_NO_REPLY)) + { + warn_unexpected (connection, NULL, + "NoReply error from Exit() method call"); + goto out; + } + + if (dbus_message_get_reply_serial (message) != serial) + { + warn_unexpected (connection, message, + "error with the correct reply serial"); + goto out; + } + + _dbus_verbose ("Got error %s after test service exited\n", + dbus_message_get_error_name (message)); + + if (!check_no_leftovers (context)) + { + _dbus_warn ("Messages were left over after %s\n", + _DBUS_FUNCTION_NAME); + goto out; + } + } + retval = TRUE; out: -- cgit