diff -u -r1.52 -r1.55 --- bus/driver.c 10 Aug 2004 03:06:59 -0000 1.52 +++ bus/driver.c 17 Sep 2004 09:14:49 -0000 1.55 @@ -278,6 +278,14 @@ _DBUS_ASSERT_ERROR_IS_CLEAR (error); + if (bus_connection_is_active (connection)) + { + /* We already handled an Hello message for this connection. */ + dbus_set_error (error, DBUS_ERROR_FAILED, + "Already handled an Hello message"); + return FALSE; + } + /* Note that when these limits are exceeded we don't disconnect the * connection; we just sort of leave it hanging there until it times * out or disconnects itself or is dropped due to the max number of @@ -447,7 +455,7 @@ DBusString service_name; char *name; int service_reply; - int flags; + dbus_uint32_t flags; dbus_bool_t retval; BusRegistry *registry; @@ -511,6 +519,7 @@ DBusMessage *reply; DBusString service_name; BusService *service; + dbus_bool_t service_exists; char *name; dbus_bool_t retval; BusRegistry *registry; @@ -525,10 +534,18 @@ return FALSE; retval = FALSE; + + if (strcmp (name, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) == 0) + { + service_exists = TRUE; + } + else + { + _dbus_string_init_const (&service_name, name); + service = bus_registry_lookup (registry, &service_name); + service_exists = service != NULL; + } - _dbus_string_init_const (&service_name, name); - service = bus_registry_lookup (registry, &service_name); - reply = dbus_message_new_method_return (message); if (reply == NULL) { @@ -537,7 +554,7 @@ } if (!dbus_message_append_args (reply, - DBUS_TYPE_BOOLEAN, service != NULL, + DBUS_TYPE_BOOLEAN, service_exists, 0)) { BUS_SET_OOM (error); @@ -842,7 +859,6 @@ DBusConnection *conn; DBusMessage *reply; unsigned long uid; - const char *base_name; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -919,7 +935,6 @@ DBusConnection *conn; DBusMessage *reply; unsigned long pid; - const char *base_name; _DBUS_ASSERT_ERROR_IS_CLEAR (error); diff -u -r1.61 -r1.62 --- bus/dispatch.c 10 Aug 2004 03:06:59 -0000 1.61 +++ bus/dispatch.c 17 Sep 2004 09:14:49 -0000 1.62 @@ -934,6 +934,96 @@ * but the correct thing may include OOM errors. */ static dbus_bool_t +check_double_hello_message (BusContext *context, + DBusConnection *connection) +{ + DBusMessage *message; + dbus_uint32_t serial; + dbus_bool_t retval; + DBusError error; + + retval = FALSE; + dbus_error_init (&error); + message = NULL; + + _dbus_verbose ("check_double_hello_message for %p\n", connection); + + message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, + DBUS_PATH_ORG_FREEDESKTOP_DBUS, + DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, + "Hello"); + + if (message == NULL) + return TRUE; + + if (!dbus_connection_send (connection, message, &serial)) + { + dbus_message_unref (message); + return TRUE; + } + + dbus_message_unref (message); + message = NULL; + + /* send our message */ + bus_test_run_clients_loop (TRUE); + + dbus_connection_ref (connection); /* because we may get disconnected */ + block_connection_until_message_from_bus (context, connection); + + if (!dbus_connection_get_is_connected (connection)) + { + _dbus_verbose ("connection was disconnected\n"); + + dbus_connection_unref (connection); + + return TRUE; + } + + dbus_connection_unref (connection); + + message = pop_message_waiting_for_memory (connection); + if (message == NULL) + { + _dbus_warn ("Did not receive a reply to %s %d on %p\n", + "Hello", serial, connection); + goto out; + } + + verbose_message_received (connection, message); + + if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS)) + { + _dbus_warn ("Message has wrong sender %s\n", + dbus_message_get_sender (message) ? + dbus_message_get_sender (message) : "(none)"); + goto out; + } + + if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR) + { + warn_unexpected (connection, message, "method return for Hello"); + goto out; + } + + if (!check_no_leftovers (context)) + goto out; + + retval = TRUE; + + out: + dbus_error_free (&error); + + if (message) + dbus_message_unref (message); + + return retval; +} + +/* returns TRUE if the correct thing happens, + * but the correct thing may include OOM errors. + */ +static dbus_bool_t check_get_connection_unix_user (BusContext *context, DBusConnection *connection) { @@ -2243,7 +2333,9 @@ ; /* good, this is a valid response */ } else if (dbus_message_is_error (message, - DBUS_ERROR_SPAWN_CHILD_EXITED)) + DBUS_ERROR_SPAWN_CHILD_EXITED) || + dbus_message_is_error (message, + DBUS_ERROR_SPAWN_EXEC_FAILED)) { ; /* good, this is expected also */ } @@ -2917,6 +3009,9 @@ if (!check_hello_message (context, foo)) _dbus_assert_not_reached ("hello message failed"); + if (!check_double_hello_message (context, foo)) + _dbus_assert_not_reached ("double hello message failed"); + if (!check_add_match_all (context, foo)) _dbus_assert_not_reached ("AddMatch message failed");