From 5bf7f759a738a451ea70732731d9a1b3e064353b Mon Sep 17 00:00:00 2001 From: Jacek Bukarewicz Date: Thu, 27 Nov 2014 11:26:21 +0100 Subject: [PATCH 4/5] Add own rule result unavailability handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Own rule result unavailability is handled like send rules - dispatching messages from the sender is blocked and resumed when result becomes available. Handler of "RequestName" method needs to return BUS_RESULT_LATER when policy result is not known therefore its return type is modified. Since bus message handlers are put into function pointer array other message handler function singatures are also affected. Change-Id: I4c2cbd4585e41fccd8a30f825a8f0d342ab56755 Cherry-picked from 35ef89cd6777ea2430077fc621d21bd01df92349 by Jose.bollo Signed-off-by: José Bollo --- bus/dispatch.c | 11 ++- bus/driver.c | 259 ++++++++++++++++++++++++++++++--------------------------- bus/driver.h | 2 +- bus/policy.c | 51 +++++++++--- bus/policy.h | 6 +- bus/services.c | 26 ++++-- bus/services.h | 3 +- bus/stats.c | 28 +++---- bus/stats.h | 6 +- 9 files changed, 229 insertions(+), 163 deletions(-) diff --git a/bus/dispatch.c b/bus/dispatch.c index e32c9263..4d57c556 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -513,8 +513,17 @@ bus_dispatch (DBusConnection *connection, } _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS); - if (!bus_driver_handle_message (connection, transaction, message, &error)) + res = bus_driver_handle_message (connection, transaction, message, &error); + if (res == BUS_RESULT_FALSE) goto out; + else if (res == BUS_RESULT_LATER) + { + /* connection has been disabled in message handler */ + bus_transaction_cancel_and_free (transaction); + transaction = NULL; + result = DBUS_HANDLER_RESULT_LATER; + goto out; + } } else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */ { diff --git a/bus/driver.c b/bus/driver.c index 5acdd62a..bc4ce0b5 100644 --- a/bus/driver.c +++ b/bus/driver.c @@ -427,7 +427,7 @@ create_unique_client_name (BusRegistry *registry, return TRUE; } -static dbus_bool_t +static BusResult bus_driver_handle_hello (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -435,7 +435,7 @@ bus_driver_handle_hello (DBusConnection *connection, { DBusString unique_name; BusService *service; - dbus_bool_t retval; + BusResult retval; BusRegistry *registry; BusConnections *connections; @@ -446,7 +446,7 @@ bus_driver_handle_hello (DBusConnection *connection, /* We already handled an Hello message for this connection. */ dbus_set_error (error, DBUS_ERROR_FAILED, "Already handled an Hello message"); - return FALSE; + return BUS_RESULT_FALSE; } /* Note that when these limits are exceeded we don't disconnect the @@ -460,16 +460,16 @@ bus_driver_handle_hello (DBusConnection *connection, error)) { _DBUS_ASSERT_ERROR_IS_SET (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!_dbus_string_init (&unique_name)) { BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } - retval = FALSE; + retval = BUS_RESULT_FALSE; registry = bus_connection_get_registry (connection); @@ -502,7 +502,7 @@ bus_driver_handle_hello (DBusConnection *connection, goto out_0; _dbus_assert (bus_connection_is_active (connection)); - retval = TRUE; + retval = BUS_RESULT_TRUE; out_0: _dbus_string_free (&unique_name); @@ -554,7 +554,7 @@ bus_driver_send_welcome_message (DBusConnection *connection, } } -static dbus_bool_t +static BusResult bus_driver_handle_list_services (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -576,14 +576,14 @@ bus_driver_handle_list_services (DBusConnection *connection, if (reply == NULL) { BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!bus_registry_list_services (registry, &services, &len)) { dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } dbus_message_iter_init_append (reply, &iter); @@ -595,7 +595,7 @@ bus_driver_handle_list_services (DBusConnection *connection, dbus_free_string_array (services); dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } { @@ -607,7 +607,7 @@ bus_driver_handle_list_services (DBusConnection *connection, dbus_free_string_array (services); dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } } @@ -620,7 +620,7 @@ bus_driver_handle_list_services (DBusConnection *connection, dbus_free_string_array (services); dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } ++i; } @@ -631,23 +631,23 @@ bus_driver_handle_list_services (DBusConnection *connection, { dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!bus_transaction_send_from_driver (transaction, connection, reply)) { dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } else { dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; } } -static dbus_bool_t +static BusResult bus_driver_handle_list_activatable_services (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -669,14 +669,14 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection, if (reply == NULL) { BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!bus_activation_list_services (activation, &services, &len)) { dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } dbus_message_iter_init_append (reply, &iter); @@ -688,7 +688,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection, dbus_free_string_array (services); dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } { @@ -700,7 +700,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection, dbus_free_string_array (services); dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } } @@ -713,7 +713,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection, dbus_free_string_array (services); dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } ++i; } @@ -724,23 +724,23 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection, { dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!bus_transaction_send_from_driver (transaction, connection, reply)) { dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } else { dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; } } -static dbus_bool_t +static BusResult bus_driver_handle_acquire_service (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -751,7 +751,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection, const char *name; dbus_uint32_t service_reply; dbus_uint32_t flags; - dbus_bool_t retval; + BusResult retval; + BusResult res; BusRegistry *registry; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -762,20 +763,24 @@ bus_driver_handle_acquire_service (DBusConnection *connection, DBUS_TYPE_STRING, &name, DBUS_TYPE_UINT32, &flags, DBUS_TYPE_INVALID)) - return FALSE; + return BUS_RESULT_FALSE; _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags); - retval = FALSE; + retval = BUS_RESULT_FALSE; reply = NULL; _dbus_string_init_const (&service_name, name); - if (!bus_registry_acquire_service (registry, connection, - &service_name, flags, - &service_reply, transaction, - error)) - goto out; + res = bus_registry_acquire_service (registry, connection, message, + &service_name, flags, + &service_reply, transaction, + error); + if (res != BUS_RESULT_TRUE) + { + retval = res; + goto out; + } reply = dbus_message_new_method_return (message); if (reply == NULL) @@ -796,7 +801,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection, goto out; } - retval = TRUE; + retval = BUS_RESULT_TRUE; out: if (reply) @@ -804,7 +809,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection, return retval; } -static dbus_bool_t +static BusResult bus_driver_handle_release_service (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -814,7 +819,7 @@ bus_driver_handle_release_service (DBusConnection *connection, DBusString service_name; const char *name; dbus_uint32_t service_reply; - dbus_bool_t retval; + BusResult retval; BusRegistry *registry; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -824,11 +829,11 @@ bus_driver_handle_release_service (DBusConnection *connection, if (!dbus_message_get_args (message, error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) - return FALSE; + return BUS_RESULT_FALSE; _dbus_verbose ("Trying to release name %s\n", name); - retval = FALSE; + retval = BUS_RESULT_FALSE; reply = NULL; _dbus_string_init_const (&service_name, name); @@ -857,7 +862,7 @@ bus_driver_handle_release_service (DBusConnection *connection, goto out; } - retval = TRUE; + retval = BUS_RESULT_TRUE; out: if (reply) @@ -865,7 +870,7 @@ bus_driver_handle_release_service (DBusConnection *connection, return retval; } -static dbus_bool_t +static BusResult bus_driver_handle_service_exists (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -876,7 +881,7 @@ bus_driver_handle_service_exists (DBusConnection *connection, BusService *service; dbus_bool_t service_exists; const char *name; - dbus_bool_t retval; + BusResult retval; BusRegistry *registry; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -886,9 +891,9 @@ bus_driver_handle_service_exists (DBusConnection *connection, if (!dbus_message_get_args (message, error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) - return FALSE; + return BUS_RESULT_FALSE; - retval = FALSE; + retval = BUS_RESULT_FALSE; if (strcmp (name, DBUS_SERVICE_DBUS) == 0) { @@ -922,7 +927,7 @@ bus_driver_handle_service_exists (DBusConnection *connection, goto out; } - retval = TRUE; + retval = BUS_RESULT_TRUE; out: if (reply) @@ -931,7 +936,7 @@ bus_driver_handle_service_exists (DBusConnection *connection, return retval; } -static dbus_bool_t +static BusResult bus_driver_handle_activate_service (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -939,7 +944,7 @@ bus_driver_handle_activate_service (DBusConnection *connection, { dbus_uint32_t flags; const char *name; - dbus_bool_t retval; + BusResult retval; BusActivation *activation; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -953,10 +958,10 @@ bus_driver_handle_activate_service (DBusConnection *connection, { _DBUS_ASSERT_ERROR_IS_SET (error); _dbus_verbose ("No memory to get arguments to StartServiceByName\n"); - return FALSE; + return BUS_RESULT_FALSE; } - retval = FALSE; + retval = BUS_RESULT_FALSE; if (!bus_activation_activate_service (activation, connection, transaction, FALSE, message, name, error)) @@ -966,7 +971,7 @@ bus_driver_handle_activate_service (DBusConnection *connection, goto out; } - retval = TRUE; + retval = BUS_RESULT_TRUE; out: return retval; @@ -1068,13 +1073,13 @@ bus_driver_send_or_activate (BusTransaction *transaction, return TRUE; } -static dbus_bool_t +static BusResult bus_driver_handle_update_activation_environment (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, DBusError *error) { - dbus_bool_t retval; + BusResult retval; BusActivation *activation; BusContext *context; DBusMessageIter iter; @@ -1090,7 +1095,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_CLEAR (error); if (!bus_driver_check_message_is_for_us (message, error)) - return FALSE; + return BUS_RESULT_FALSE; #ifdef DBUS_UNIX { @@ -1100,7 +1105,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection, */ if (!bus_driver_check_caller_is_privileged (connection, transaction, message, error)) - return FALSE; + return BUS_RESULT_FALSE; } #endif @@ -1111,7 +1116,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection, dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, "Cannot change activation environment " "on a system bus."); - return FALSE; + return BUS_RESULT_FALSE; } activation = bus_connection_get_activation (connection); @@ -1125,7 +1130,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection, dbus_message_iter_recurse (&iter, &dict_iter); - retval = FALSE; + retval = BUS_RESULT_FALSE; systemd_message = NULL; /* Then loop through the sent dictionary, add the location of @@ -1291,7 +1296,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection, message, error)) goto out; - retval = TRUE; + retval = BUS_RESULT_TRUE; out: if (systemd_message != NULL) @@ -1301,7 +1306,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection, return retval; } -static dbus_bool_t +static BusResult bus_driver_handle_add_match (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1367,16 +1372,16 @@ bus_driver_handle_add_match (DBusConnection *connection, bus_match_rule_unref (rule); - return TRUE; + return BUS_RESULT_TRUE; failed: _DBUS_ASSERT_ERROR_IS_SET (error); if (rule) bus_match_rule_unref (rule); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_remove_match (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1420,16 +1425,16 @@ bus_driver_handle_remove_match (DBusConnection *connection, bus_match_rule_unref (rule); - return TRUE; + return BUS_RESULT_TRUE; failed: _DBUS_ASSERT_ERROR_IS_SET (error); if (rule) bus_match_rule_unref (rule); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_get_service_owner (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1499,7 +1504,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection, dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -1508,10 +1513,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_SET (error); if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_list_queued_owners (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1602,7 +1607,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection, dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -1615,10 +1620,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection, if (base_names) _dbus_list_clear (&base_names); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_get_connection_unix_user (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1673,7 +1678,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection, dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -1682,10 +1687,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_SET (error); if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1740,7 +1745,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection, dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -1749,10 +1754,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_SET (error); if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1803,7 +1808,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection, dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -1812,10 +1817,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_SET (error); if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1863,7 +1868,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -1872,10 +1877,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne _DBUS_ASSERT_ERROR_IS_SET (error); if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_get_connection_credentials (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -1987,7 +1992,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection, dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -2001,10 +2006,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection, dbus_message_unref (reply); } - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_reload_config (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2029,7 +2034,7 @@ bus_driver_handle_reload_config (DBusConnection *connection, goto oom; dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -2038,11 +2043,11 @@ bus_driver_handle_reload_config (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_SET (error); if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } #ifdef DBUS_ENABLE_VERBOSE_MODE -static dbus_bool_t +static BusResult bus_driver_handle_enable_verbose (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2062,7 +2067,7 @@ bus_driver_handle_enable_verbose (DBusConnection *connection, _dbus_set_verbose(TRUE); dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -2071,10 +2076,10 @@ bus_driver_handle_enable_verbose (DBusConnection *connection, if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_disable_verbose (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2094,7 +2099,7 @@ bus_driver_handle_disable_verbose (DBusConnection *connection, _dbus_set_verbose(FALSE); dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -2103,11 +2108,11 @@ bus_driver_handle_disable_verbose (DBusConnection *connection, if (reply) dbus_message_unref (reply); - return FALSE; + return BUS_RESULT_FALSE; } #endif -static dbus_bool_t +static BusResult bus_driver_handle_get_id (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2123,7 +2128,7 @@ bus_driver_handle_get_id (DBusConnection *connection, if (!_dbus_string_init (&uuid)) { BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } reply = NULL; @@ -2149,7 +2154,7 @@ bus_driver_handle_get_id (DBusConnection *connection, _dbus_string_free (&uuid); dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -2159,10 +2164,10 @@ bus_driver_handle_get_id (DBusConnection *connection, if (reply) dbus_message_unref (reply); _dbus_string_free (&uuid); - return FALSE; + return BUS_RESULT_FALSE; } -static dbus_bool_t +static BusResult bus_driver_handle_become_monitor (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2178,7 +2183,7 @@ bus_driver_handle_become_monitor (DBusConnection *connection, int i; int n_match_rules; dbus_uint32_t flags; - dbus_bool_t ret = FALSE; + BusResult ret = BUS_RESULT_FALSE; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -2258,10 +2263,10 @@ bus_driver_handle_become_monitor (DBusConnection *connection, if (!bus_connection_be_monitor (connection, transaction, &rules, error)) goto out; - ret = TRUE; + ret = BUS_RESULT_TRUE; out: - if (ret) + if (ret == BUS_RESULT_TRUE) _DBUS_ASSERT_ERROR_IS_CLEAR (error); else _DBUS_ASSERT_ERROR_IS_SET (error); @@ -2282,10 +2287,10 @@ typedef struct const char *name; const char *in_args; const char *out_args; - dbus_bool_t (* handler) (DBusConnection *connection, - BusTransaction *transaction, - DBusMessage *message, - DBusError *error); + BusResult (* handler) (DBusConnection *connection, + BusTransaction *transaction, + DBusMessage *message, + DBusError *error); } MessageHandler; /* For speed it might be useful to sort this in order of @@ -2370,7 +2375,7 @@ static const MessageHandler dbus_message_handlers[] = { { NULL, NULL, NULL, NULL } }; -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *, +static BusResult bus_driver_handle_introspect (DBusConnection *, BusTransaction *, DBusMessage *, DBusError *); static const MessageHandler introspectable_message_handlers[] = { @@ -2514,7 +2519,7 @@ bus_driver_generate_introspect_string (DBusString *xml) return TRUE; } -static dbus_bool_t +static BusResult bus_driver_handle_introspect (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2534,13 +2539,13 @@ bus_driver_handle_introspect (DBusConnection *connection, DBUS_TYPE_INVALID)) { _DBUS_ASSERT_ERROR_IS_SET (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!_dbus_string_init (&xml)) { BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } if (!bus_driver_generate_introspect_string (&xml)) @@ -2563,7 +2568,7 @@ bus_driver_handle_introspect (DBusConnection *connection, dbus_message_unref (reply); _dbus_string_free (&xml); - return TRUE; + return BUS_RESULT_TRUE; oom: BUS_SET_OOM (error); @@ -2573,7 +2578,7 @@ bus_driver_handle_introspect (DBusConnection *connection, _dbus_string_free (&xml); - return FALSE; + return BUS_RESULT_FALSE; } /* @@ -2608,7 +2613,7 @@ bus_driver_check_message_is_for_us (DBusMessage *message, return TRUE; } -dbus_bool_t +BusResult bus_driver_handle_message (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -2618,6 +2623,7 @@ bus_driver_handle_message (DBusConnection *connection, const InterfaceHandler *ih; const MessageHandler *mh; dbus_bool_t found_interface = FALSE; + BusResult res; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -2633,7 +2639,7 @@ bus_driver_handle_message (DBusConnection *connection, transaction, message, error)) - return FALSE; + return BUS_RESULT_FALSE; context = bus_connection_get_context (connection); systemd = bus_driver_get_owner_of_name (connection, @@ -2650,7 +2656,7 @@ bus_driver_handle_message (DBusConnection *connection, attacker ? attacker : "(unauthenticated)", bus_connection_get_loginfo (connection)); /* ignore it */ - return TRUE; + return BUS_RESULT_TRUE; } if (!bus_context_get_systemd_activation (context)) @@ -2658,16 +2664,16 @@ bus_driver_handle_message (DBusConnection *connection, bus_context_log (context, DBUS_SYSTEM_LOG_WARNING, "Ignoring unexpected ActivationFailure message " "while not using systemd activation"); - return FALSE; + return BUS_RESULT_FALSE; } - return dbus_activation_systemd_failure(bus_context_get_activation(context), message); + return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE; } if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL) { _dbus_verbose ("Driver got a non-method-call message, ignoring\n"); - return TRUE; /* we just ignore this */ + return BUS_RESULT_TRUE; /* we just ignore this */ } /* may be NULL, which means "any interface will do" */ @@ -2709,20 +2715,27 @@ bus_driver_handle_message (DBusConnection *connection, name, dbus_message_get_signature (message), mh->in_args); _DBUS_ASSERT_ERROR_IS_SET (error); - return FALSE; + return BUS_RESULT_FALSE; } - if ((* mh->handler) (connection, transaction, message, error)) + res = (* mh->handler) (connection, transaction, message, error); + if (res == BUS_RESULT_TRUE) { _DBUS_ASSERT_ERROR_IS_CLEAR (error); _dbus_verbose ("Driver handler succeeded\n"); - return TRUE; + return BUS_RESULT_TRUE; } - else + else if (res == BUS_RESULT_FALSE) { _DBUS_ASSERT_ERROR_IS_SET (error); _dbus_verbose ("Driver handler returned failure\n"); - return FALSE; + return BUS_RESULT_FALSE; + } + else if (res == BUS_RESULT_LATER) + { + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + _dbus_verbose ("Driver handler delayed message processing due to policy check\n"); + return BUS_RESULT_LATER; } } } @@ -2734,7 +2747,7 @@ bus_driver_handle_message (DBusConnection *connection, "%s does not understand message %s", DBUS_SERVICE_DBUS, name); - return FALSE; + return BUS_RESULT_FALSE; } void diff --git a/bus/driver.h b/bus/driver.h index 201709c4..3ff4ff15 100644 --- a/bus/driver.h +++ b/bus/driver.h @@ -28,7 +28,7 @@ #include "connection.h" void bus_driver_remove_connection (DBusConnection *connection); -dbus_bool_t bus_driver_handle_message (DBusConnection *connection, +BusResult bus_driver_handle_message (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, DBusError *error); diff --git a/bus/policy.c b/bus/policy.c index 47bd1a24..7244a46f 100644 --- a/bus/policy.c +++ b/bus/policy.c @@ -1323,18 +1323,21 @@ bus_client_policy_check_can_receive (BusClientPolicy *policy, -static dbus_bool_t +static BusResult bus_rules_check_can_own (DBusList *rules, - const DBusString *service_name) + const DBusString *service_name, + DBusConnection *connection, + DBusMessage *message) { DBusList *link; - dbus_bool_t allowed; + BusResult result; + const char *privilege; /* rules is in the order the rules appeared * in the config file, i.e. last rule that applies wins */ - allowed = FALSE; + result = BUS_RESULT_FALSE; link = _dbus_list_get_first_link (&rules); while (link != NULL) { @@ -1370,17 +1373,45 @@ bus_rules_check_can_own (DBusList *rules, } /* Use this rule */ - allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW; + switch (rule->access) + { + case BUS_POLICY_RULE_ACCESS_ALLOW: + result = BUS_RESULT_TRUE; + break; + case BUS_POLICY_RULE_ACCESS_DENY: + result = BUS_RESULT_FALSE; + break; + case BUS_POLICY_RULE_ACCESS_CHECK: + result = BUS_RESULT_LATER; + privilege = rule->privilege; + break; + } } - return allowed; + if (result == BUS_RESULT_LATER) + { + BusContext *context = bus_connection_get_context(connection); + BusCheck *check = bus_context_get_check(context); + BusDeferredMessage *deferred_message; + + result = bus_check_privilege(check, message, connection, NULL, NULL, + privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message); + if (result == BUS_RESULT_LATER) + { + bus_deferred_message_disable_sender(deferred_message); + } + } + + return result; } -dbus_bool_t +BusResult bus_client_policy_check_can_own (BusClientPolicy *policy, - const DBusString *service_name) + const DBusString *service_name, + DBusConnection *connection, + DBusMessage *message) { - return bus_rules_check_can_own (policy->rules, service_name); + return bus_rules_check_can_own (policy->rules, service_name, connection, message); } #ifdef DBUS_ENABLE_EMBEDDED_TESTS @@ -1388,7 +1419,7 @@ dbus_bool_t bus_policy_check_can_own (BusPolicy *policy, const DBusString *service_name) { - return bus_rules_check_can_own (policy->default_rules, service_name); + return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL) == BUS_RESULT_TRUE; } #endif /* DBUS_ENABLE_EMBEDDED_TESTS */ diff --git a/bus/policy.h b/bus/policy.h index e9f193af..1f234310 100644 --- a/bus/policy.h +++ b/bus/policy.h @@ -170,8 +170,10 @@ BusResult bus_client_policy_check_can_receive (BusClientPolicy *polic dbus_int32_t *toggles, const char **privilege_param, BusDeferredMessage **deferred_message); -dbus_bool_t bus_client_policy_check_can_own (BusClientPolicy *policy, - const DBusString *service_name); +BusResult bus_client_policy_check_can_own (BusClientPolicy *policy, + const DBusString *service_name, + DBusConnection *connection, + DBusMessage *message); dbus_bool_t bus_client_policy_append_rule (BusClientPolicy *policy, BusPolicyRule *rule); void bus_client_policy_optimize (BusClientPolicy *policy); diff --git a/bus/services.c b/bus/services.c index 6a4c8848..fcc2d261 100644 --- a/bus/services.c +++ b/bus/services.c @@ -376,24 +376,26 @@ bus_registry_list_services (BusRegistry *registry, return FALSE; } -dbus_bool_t +BusResult bus_registry_acquire_service (BusRegistry *registry, DBusConnection *connection, + DBusMessage *message, const DBusString *service_name, dbus_uint32_t flags, dbus_uint32_t *result, BusTransaction *transaction, DBusError *error) { - dbus_bool_t retval; + BusResult retval; DBusConnection *old_owner_conn; BusClientPolicy *policy; BusService *service; BusActivation *activation; BusSELinuxID *sid; BusOwner *primary_owner; + BusResult res; - retval = FALSE; + retval = BUS_RESULT_FALSE; if (!_dbus_validate_bus_name (service_name, 0, _dbus_string_get_length (service_name))) @@ -466,7 +468,8 @@ bus_registry_acquire_service (BusRegistry *registry, _dbus_string_get_const_data (service_name), error)) goto out; - if (!bus_client_policy_check_can_own (policy, service_name)) + res = bus_client_policy_check_can_own (policy, service_name, connection, message); + if (res == BUS_RESULT_FALSE) { dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, "Connection \"%s\" is not allowed to own the service \"%s\" due " @@ -477,6 +480,11 @@ bus_registry_acquire_service (BusRegistry *registry, _dbus_string_get_const_data (service_name)); goto out; } + else if (res == BUS_RESULT_LATER) + { + retval = BUS_RESULT_LATER; + goto out; + } if (bus_connection_get_n_services_owned (connection) >= bus_context_get_max_services_per_connection (registry->context)) @@ -593,11 +601,13 @@ bus_registry_acquire_service (BusRegistry *registry, } activation = bus_context_get_activation (registry->context); - retval = bus_activation_send_pending_auto_activation_messages (activation, + + if (bus_activation_send_pending_auto_activation_messages (activation, service, - transaction); - if (!retval) - BUS_SET_OOM (error); + transaction)) + retval = BUS_RESULT_TRUE; + else + BUS_SET_OOM (error); out: return retval; diff --git a/bus/services.h b/bus/services.h index 056dd9fa..3df3dd7d 100644 --- a/bus/services.h +++ b/bus/services.h @@ -50,8 +50,9 @@ void bus_registry_foreach (BusRegistry *registry dbus_bool_t bus_registry_list_services (BusRegistry *registry, char ***listp, int *array_len); -dbus_bool_t bus_registry_acquire_service (BusRegistry *registry, +BusResult bus_registry_acquire_service (BusRegistry *registry, DBusConnection *connection, + DBusMessage *message, const DBusString *service_name, dbus_uint32_t flags, dbus_uint32_t *result, diff --git a/bus/stats.c b/bus/stats.c index dace0e29..aab0e5c9 100644 --- a/bus/stats.c +++ b/bus/stats.c @@ -36,7 +36,7 @@ #ifdef DBUS_ENABLE_STATS -dbus_bool_t +BusResult bus_stats_handle_get_stats (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, @@ -52,7 +52,7 @@ bus_stats_handle_get_stats (DBusConnection *connection, _DBUS_ASSERT_ERROR_IS_CLEAR (error); if (!bus_driver_check_message_is_for_us (message, error)) - return FALSE; + return BUS_RESULT_FALSE; context = bus_transaction_get_context (transaction); connections = bus_context_get_connections (context); @@ -107,17 +107,17 @@ bus_stats_handle_get_stats (DBusConnection *connection, goto oom; dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: if (reply != NULL) dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } -dbus_bool_t +BusResult bus_stats_handle_get_connection_stats (DBusConnection *caller_connection, BusTransaction *transaction, DBusMessage *message, @@ -137,14 +137,14 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection, _DBUS_ASSERT_ERROR_IS_CLEAR (error); if (!bus_driver_check_message_is_for_us (message, error)) - return FALSE; + return BUS_RESULT_FALSE; registry = bus_connection_get_registry (caller_connection); if (! dbus_message_get_args (message, error, DBUS_TYPE_STRING, &bus_name, DBUS_TYPE_INVALID)) - return FALSE; + return BUS_RESULT_FALSE; _dbus_string_init_const (&bus_name_str, bus_name); service = bus_registry_lookup (registry, &bus_name_str); @@ -153,7 +153,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection, { dbus_set_error (error, DBUS_ERROR_NAME_HAS_NO_OWNER, "Bus name '%s' has no owner", bus_name); - return FALSE; + return BUS_RESULT_FALSE; } stats_connection = bus_service_get_primary_owners_connection (service); @@ -215,18 +215,18 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection, goto oom; dbus_message_unref (reply); - return TRUE; + return BUS_RESULT_TRUE; oom: if (reply != NULL) dbus_message_unref (reply); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } -dbus_bool_t +BusResult bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection, BusTransaction *transaction, DBusMessage *message, @@ -250,7 +250,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection, matchmaker = bus_context_get_matchmaker (context); if (!bus_registry_list_services (registry, &services, &services_len)) - return FALSE; + return BUS_RESULT_FALSE; reply = dbus_message_new_method_return (message); if (reply == NULL) @@ -329,7 +329,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection, dbus_message_unref (reply); dbus_free_string_array (services); - return TRUE; + return BUS_RESULT_TRUE; oom: if (reply != NULL) @@ -338,7 +338,7 @@ oom: dbus_free_string_array (services); BUS_SET_OOM (error); - return FALSE; + return BUS_RESULT_FALSE; } #endif diff --git a/bus/stats.h b/bus/stats.h index dcb022c4..683fa175 100644 --- a/bus/stats.h +++ b/bus/stats.h @@ -25,17 +25,17 @@ #define BUS_INTERFACE_STATS "org.freedesktop.DBus.Debug.Stats" -dbus_bool_t bus_stats_handle_get_stats (DBusConnection *connection, +BusResult bus_stats_handle_get_stats (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, DBusError *error); -dbus_bool_t bus_stats_handle_get_connection_stats (DBusConnection *connection, +BusResult bus_stats_handle_get_connection_stats (DBusConnection *connection, BusTransaction *transaction, DBusMessage *message, DBusError *error); -dbus_bool_t bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection, +BusResult bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection, BusTransaction *transaction, DBusMessage *message, DBusError *error); -- 2.14.3