1 From 28ada62c98d74285dc22b66650b09b6c8f2c28c4 Mon Sep 17 00:00:00 2001
2 From: Jacek Bukarewicz <j.bukarewicz@samsung.com>
3 Date: Thu, 27 Nov 2014 11:26:21 +0100
4 Subject: [PATCH 4/8] Add own rule result unavailability handling
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 Own rule result unavailability is handled like send rules - dispatching
10 messages from the sender is blocked and resumed when result becomes
13 Handler of "RequestName" method needs to return BUS_RESULT_LATER when
14 policy result is not known therefore its return type is modified.
15 Since bus message handlers are put into function pointer array other
16 message handler function singatures are also affected.
18 Cherry-picked from 35ef89cd6777ea2430077fc621d21bd01df92349 by Jose.bollo
20 Updated for dbus 1.10.20 by Scott Murray and José Bollo
22 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
23 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
25 bus/dispatch.c | 11 +-
26 bus/driver.c | 334 ++++++++++++++++++++++++++++---------------------
28 bus/policy.c | 52 ++++++--
30 bus/services.c | 26 ++--
34 9 files changed, 283 insertions(+), 180 deletions(-)
36 diff --git a/bus/dispatch.c b/bus/dispatch.c
37 index 7d30ce4..4b84c21 100644
40 @@ -517,8 +517,17 @@ bus_dispatch (DBusConnection *connection,
43 _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
44 - if (!bus_driver_handle_message (connection, transaction, message, &error))
45 + res = bus_driver_handle_message (connection, transaction, message, &error);
46 + if (res == BUS_RESULT_FALSE)
48 + else if (res == BUS_RESULT_LATER)
50 + /* connection has been disabled in message handler */
51 + bus_transaction_cancel_and_free (transaction);
53 + result = DBUS_HANDLER_RESULT_LATER;
57 else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
59 diff --git a/bus/driver.c b/bus/driver.c
60 index d89a658..aaeb3b2 100644
63 @@ -420,7 +420,7 @@ create_unique_client_name (BusRegistry *registry,
69 bus_driver_handle_hello (DBusConnection *connection,
70 BusTransaction *transaction,
72 @@ -428,7 +428,7 @@ bus_driver_handle_hello (DBusConnection *connection,
74 DBusString unique_name;
78 BusRegistry *registry;
79 BusConnections *connections;
81 @@ -442,7 +442,7 @@ bus_driver_handle_hello (DBusConnection *connection,
82 /* We already handled an Hello message for this connection. */
83 dbus_set_error (error, DBUS_ERROR_FAILED,
84 "Already handled an Hello message");
86 + return BUS_RESULT_FALSE;
89 /* Note that when these limits are exceeded we don't disconnect the
90 @@ -464,16 +464,16 @@ bus_driver_handle_hello (DBusConnection *connection,
91 bus_context_log (context, DBUS_SYSTEM_LOG_WARNING, "%s (%s=%d)",
92 tmp_error.message, limit_name, limit);
93 dbus_move_error (&tmp_error, error);
95 + return BUS_RESULT_FALSE;
98 if (!_dbus_string_init (&unique_name))
102 + return BUS_RESULT_FALSE;
106 + retval = BUS_RESULT_FALSE;
108 registry = bus_connection_get_registry (connection);
110 @@ -506,7 +506,7 @@ bus_driver_handle_hello (DBusConnection *connection,
113 _dbus_assert (bus_connection_is_active (connection));
115 + retval = BUS_RESULT_TRUE;
118 _dbus_string_free (&unique_name);
119 @@ -558,7 +558,7 @@ bus_driver_send_welcome_message (DBusConnection *connection,
125 bus_driver_handle_list_services (DBusConnection *connection,
126 BusTransaction *transaction,
127 DBusMessage *message,
128 @@ -580,14 +580,14 @@ bus_driver_handle_list_services (DBusConnection *connection,
133 + return BUS_RESULT_FALSE;
136 if (!bus_registry_list_services (registry, &services, &len))
138 dbus_message_unref (reply);
141 + return BUS_RESULT_FALSE;
144 dbus_message_iter_init_append (reply, &iter);
145 @@ -599,7 +599,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
146 dbus_free_string_array (services);
147 dbus_message_unref (reply);
150 + return BUS_RESULT_FALSE;
154 @@ -611,7 +611,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
155 dbus_free_string_array (services);
156 dbus_message_unref (reply);
159 + return BUS_RESULT_FALSE;
163 @@ -624,7 +624,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
164 dbus_free_string_array (services);
165 dbus_message_unref (reply);
168 + return BUS_RESULT_FALSE;
172 @@ -635,23 +635,23 @@ bus_driver_handle_list_services (DBusConnection *connection,
174 dbus_message_unref (reply);
177 + return BUS_RESULT_FALSE;
180 if (!bus_transaction_send_from_driver (transaction, connection, reply))
182 dbus_message_unref (reply);
185 + return BUS_RESULT_FALSE;
189 dbus_message_unref (reply);
191 + return BUS_RESULT_TRUE;
197 bus_driver_handle_list_activatable_services (DBusConnection *connection,
198 BusTransaction *transaction,
199 DBusMessage *message,
200 @@ -673,14 +673,14 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
205 + return BUS_RESULT_FALSE;
208 if (!bus_activation_list_services (activation, &services, &len))
210 dbus_message_unref (reply);
213 + return BUS_RESULT_FALSE;
216 dbus_message_iter_init_append (reply, &iter);
217 @@ -692,7 +692,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
218 dbus_free_string_array (services);
219 dbus_message_unref (reply);
222 + return BUS_RESULT_FALSE;
226 @@ -704,7 +704,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
227 dbus_free_string_array (services);
228 dbus_message_unref (reply);
231 + return BUS_RESULT_FALSE;
235 @@ -717,7 +717,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
236 dbus_free_string_array (services);
237 dbus_message_unref (reply);
240 + return BUS_RESULT_FALSE;
244 @@ -728,23 +728,23 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
246 dbus_message_unref (reply);
249 + return BUS_RESULT_FALSE;
252 if (!bus_transaction_send_from_driver (transaction, connection, reply))
254 dbus_message_unref (reply);
257 + return BUS_RESULT_FALSE;
261 dbus_message_unref (reply);
263 + return BUS_RESULT_TRUE;
269 bus_driver_handle_acquire_service (DBusConnection *connection,
270 BusTransaction *transaction,
271 DBusMessage *message,
272 @@ -755,7 +755,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
274 dbus_uint32_t service_reply;
276 - dbus_bool_t retval;
279 BusRegistry *registry;
281 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
282 @@ -766,20 +767,24 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
283 DBUS_TYPE_STRING, &name,
284 DBUS_TYPE_UINT32, &flags,
287 + return BUS_RESULT_FALSE;
289 _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
292 + retval = BUS_RESULT_FALSE;
295 _dbus_string_init_const (&service_name, name);
297 - if (!bus_registry_acquire_service (registry, connection,
298 - &service_name, flags,
299 - &service_reply, transaction,
302 + res = bus_registry_acquire_service (registry, connection, message,
303 + &service_name, flags,
304 + &service_reply, transaction,
306 + if (res != BUS_RESULT_TRUE)
312 reply = dbus_message_new_method_return (message);
314 @@ -800,7 +805,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
319 + retval = BUS_RESULT_TRUE;
323 @@ -808,7 +813,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
329 bus_driver_handle_release_service (DBusConnection *connection,
330 BusTransaction *transaction,
331 DBusMessage *message,
332 @@ -818,7 +823,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
333 DBusString service_name;
335 dbus_uint32_t service_reply;
336 - dbus_bool_t retval;
338 BusRegistry *registry;
340 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
341 @@ -828,11 +833,11 @@ bus_driver_handle_release_service (DBusConnection *connection,
342 if (!dbus_message_get_args (message, error,
343 DBUS_TYPE_STRING, &name,
346 + return BUS_RESULT_FALSE;
348 _dbus_verbose ("Trying to release name %s\n", name);
351 + retval = BUS_RESULT_FALSE;
354 _dbus_string_init_const (&service_name, name);
355 @@ -861,7 +866,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
360 + retval = BUS_RESULT_TRUE;
364 @@ -869,7 +874,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
370 bus_driver_handle_service_exists (DBusConnection *connection,
371 BusTransaction *transaction,
372 DBusMessage *message,
373 @@ -880,7 +885,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
375 dbus_bool_t service_exists;
377 - dbus_bool_t retval;
379 BusRegistry *registry;
381 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
382 @@ -890,9 +895,9 @@ bus_driver_handle_service_exists (DBusConnection *connection,
383 if (!dbus_message_get_args (message, error,
384 DBUS_TYPE_STRING, &name,
387 + return BUS_RESULT_FALSE;
390 + retval = BUS_RESULT_FALSE;
392 if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
394 @@ -926,7 +931,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
399 + retval = BUS_RESULT_TRUE;
403 @@ -935,7 +940,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
409 bus_driver_handle_activate_service (DBusConnection *connection,
410 BusTransaction *transaction,
411 DBusMessage *message,
412 @@ -943,7 +948,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
416 - dbus_bool_t retval;
418 BusActivation *activation;
420 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
421 @@ -957,10 +962,10 @@ bus_driver_handle_activate_service (DBusConnection *connection,
423 _DBUS_ASSERT_ERROR_IS_SET (error);
424 _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
426 + return BUS_RESULT_FALSE;
430 + retval = BUS_RESULT_FALSE;
432 if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
433 message, name, error))
434 @@ -970,7 +975,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
439 + retval = BUS_RESULT_TRUE;
443 @@ -1072,13 +1077,13 @@ bus_driver_send_or_activate (BusTransaction *transaction,
449 bus_driver_handle_update_activation_environment (DBusConnection *connection,
450 BusTransaction *transaction,
451 DBusMessage *message,
454 - dbus_bool_t retval;
456 BusActivation *activation;
458 DBusMessageIter iter;
459 @@ -1100,7 +1105,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
460 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
461 "Cannot change activation environment "
464 + return BUS_RESULT_FALSE;
467 activation = bus_connection_get_activation (connection);
468 @@ -1114,7 +1119,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
470 dbus_message_iter_recurse (&iter, &dict_iter);
473 + retval = BUS_RESULT_FALSE;
474 systemd_message = NULL;
476 /* Then loop through the sent dictionary, add the location of
477 @@ -1279,7 +1284,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
478 if (!bus_driver_send_ack_reply (connection, transaction, message, error))
482 + retval = BUS_RESULT_TRUE;
485 if (systemd_message != NULL)
486 @@ -1289,7 +1294,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
492 bus_driver_handle_add_match (DBusConnection *connection,
493 BusTransaction *transaction,
494 DBusMessage *message,
495 @@ -1371,16 +1376,16 @@ bus_driver_handle_add_match (DBusConnection *connection,
497 bus_match_rule_unref (rule);
500 + return BUS_RESULT_TRUE;
503 _DBUS_ASSERT_ERROR_IS_SET (error);
505 bus_match_rule_unref (rule);
507 + return BUS_RESULT_FALSE;
512 bus_driver_handle_remove_match (DBusConnection *connection,
513 BusTransaction *transaction,
514 DBusMessage *message,
515 @@ -1423,16 +1428,16 @@ bus_driver_handle_remove_match (DBusConnection *connection,
517 bus_match_rule_unref (rule);
520 + return BUS_RESULT_TRUE;
523 _DBUS_ASSERT_ERROR_IS_SET (error);
525 bus_match_rule_unref (rule);
527 + return BUS_RESULT_FALSE;
532 bus_driver_handle_get_service_owner (DBusConnection *connection,
533 BusTransaction *transaction,
534 DBusMessage *message,
535 @@ -1502,7 +1507,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
537 dbus_message_unref (reply);
540 + return BUS_RESULT_TRUE;
544 @@ -1511,10 +1516,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
545 _DBUS_ASSERT_ERROR_IS_SET (error);
547 dbus_message_unref (reply);
549 + return BUS_RESULT_FALSE;
554 bus_driver_handle_list_queued_owners (DBusConnection *connection,
555 BusTransaction *transaction,
556 DBusMessage *message,
557 @@ -1606,7 +1611,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
559 dbus_message_unref (reply);
562 + return BUS_RESULT_TRUE;
566 @@ -1619,10 +1624,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
568 _dbus_list_clear (&base_names);
571 + return BUS_RESULT_FALSE;
576 bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
577 BusTransaction *transaction,
578 DBusMessage *message,
579 @@ -1679,7 +1684,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
581 dbus_message_unref (reply);
584 + return BUS_RESULT_TRUE;
588 @@ -1688,10 +1693,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
589 _DBUS_ASSERT_ERROR_IS_SET (error);
591 dbus_message_unref (reply);
593 + return BUS_RESULT_FALSE;
598 bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
599 BusTransaction *transaction,
600 DBusMessage *message,
601 @@ -1748,7 +1753,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
603 dbus_message_unref (reply);
606 + return BUS_RESULT_TRUE;
610 @@ -1757,10 +1762,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
611 _DBUS_ASSERT_ERROR_IS_SET (error);
613 dbus_message_unref (reply);
615 + return BUS_RESULT_FALSE;
620 bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
621 BusTransaction *transaction,
622 DBusMessage *message,
623 @@ -1811,7 +1816,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
625 dbus_message_unref (reply);
628 + return BUS_RESULT_TRUE;
632 @@ -1820,10 +1825,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
633 _DBUS_ASSERT_ERROR_IS_SET (error);
635 dbus_message_unref (reply);
637 + return BUS_RESULT_FALSE;
642 bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
643 BusTransaction *transaction,
644 DBusMessage *message,
645 @@ -1872,7 +1877,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
647 dbus_message_unref (reply);
650 + return BUS_RESULT_TRUE;
654 @@ -1881,10 +1886,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
655 _DBUS_ASSERT_ERROR_IS_SET (error);
657 dbus_message_unref (reply);
659 + return BUS_RESULT_FALSE;
664 bus_driver_handle_get_connection_credentials (DBusConnection *connection,
665 BusTransaction *transaction,
666 DBusMessage *message,
667 @@ -1998,7 +2003,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
669 dbus_message_unref (reply);
672 + return BUS_RESULT_TRUE;
676 @@ -2012,10 +2017,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
677 dbus_message_unref (reply);
681 + return BUS_RESULT_FALSE;
686 bus_driver_handle_reload_config (DBusConnection *connection,
687 BusTransaction *transaction,
688 DBusMessage *message,
689 @@ -2040,7 +2045,7 @@ bus_driver_handle_reload_config (DBusConnection *connection,
692 dbus_message_unref (reply);
694 + return BUS_RESULT_TRUE;
698 @@ -2049,11 +2054,11 @@ bus_driver_handle_reload_config (DBusConnection *connection,
699 _DBUS_ASSERT_ERROR_IS_SET (error);
701 dbus_message_unref (reply);
703 + return BUS_RESULT_FALSE;
706 #ifdef DBUS_ENABLE_VERBOSE_MODE
709 bus_driver_handle_enable_verbose (DBusConnection *connection,
710 BusTransaction *transaction,
711 DBusMessage *message,
712 @@ -2073,7 +2078,7 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
713 _dbus_set_verbose(TRUE);
715 dbus_message_unref (reply);
717 + return BUS_RESULT_TRUE;
720 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
721 @@ -2082,10 +2087,10 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
724 dbus_message_unref (reply);
726 + return BUS_RESULT_FALSE;
731 bus_driver_handle_disable_verbose (DBusConnection *connection,
732 BusTransaction *transaction,
733 DBusMessage *message,
734 @@ -2105,7 +2110,7 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
735 _dbus_set_verbose(FALSE);
737 dbus_message_unref (reply);
739 + return BUS_RESULT_TRUE;
742 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
743 @@ -2114,11 +2119,11 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
746 dbus_message_unref (reply);
748 + return BUS_RESULT_FALSE;
754 bus_driver_handle_get_id (DBusConnection *connection,
755 BusTransaction *transaction,
756 DBusMessage *message,
757 @@ -2134,7 +2139,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
758 if (!_dbus_string_init (&uuid))
762 + return BUS_RESULT_FALSE;
766 @@ -2160,7 +2165,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
768 _dbus_string_free (&uuid);
769 dbus_message_unref (reply);
771 + return BUS_RESULT_TRUE;
774 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
775 @@ -2170,10 +2175,10 @@ bus_driver_handle_get_id (DBusConnection *connection,
777 dbus_message_unref (reply);
778 _dbus_string_free (&uuid);
780 + return BUS_RESULT_FALSE;
785 bus_driver_handle_become_monitor (DBusConnection *connection,
786 BusTransaction *transaction,
787 DBusMessage *message,
788 @@ -2189,7 +2194,7 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
792 - dbus_bool_t ret = FALSE;
793 + BusResult ret = BUS_RESULT_FALSE;
795 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
797 @@ -2262,10 +2267,10 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
798 if (!bus_connection_be_monitor (connection, transaction, &rules, error))
802 + ret = BUS_RESULT_TRUE;
806 + if (ret == BUS_RESULT_TRUE)
807 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
809 _DBUS_ASSERT_ERROR_IS_SET (error);
810 @@ -2281,7 +2286,7 @@ out:
816 bus_driver_handle_get_machine_id (DBusConnection *connection,
817 BusTransaction *transaction,
818 DBusMessage *message,
819 @@ -2296,7 +2301,7 @@ bus_driver_handle_get_machine_id (DBusConnection *connection,
820 if (!_dbus_string_init (&uuid))
824 + return BUS_RESULT_FALSE;
827 if (!_dbus_get_local_machine_uuid_encoded (&uuid, error))
828 @@ -2321,7 +2326,7 @@ bus_driver_handle_get_machine_id (DBusConnection *connection,
830 _dbus_string_free (&uuid);
831 dbus_message_unref (reply);
833 + return BUS_RESULT_TRUE;
836 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
837 @@ -2335,29 +2340,30 @@ fail:
838 dbus_message_unref (reply);
840 _dbus_string_free (&uuid);
842 + return BUS_RESULT_FALSE;
847 bus_driver_handle_ping (DBusConnection *connection,
848 BusTransaction *transaction,
849 DBusMessage *message,
852 - return bus_driver_send_ack_reply (connection, transaction, message, error);
853 + return bus_driver_send_ack_reply (connection, transaction, message, error) == TRUE
854 + ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
857 -static dbus_bool_t bus_driver_handle_get (DBusConnection *connection,
858 +static BusResult bus_driver_handle_get (DBusConnection *connection,
859 BusTransaction *transaction,
860 DBusMessage *message,
863 -static dbus_bool_t bus_driver_handle_get_all (DBusConnection *connection,
864 +static BusResult bus_driver_handle_get_all (DBusConnection *connection,
865 BusTransaction *transaction,
866 DBusMessage *message,
869 -static dbus_bool_t bus_driver_handle_set (DBusConnection *connection,
870 +static BusResult bus_driver_handle_set (DBusConnection *connection,
871 BusTransaction *transaction,
872 DBusMessage *message,
874 @@ -2389,10 +2395,10 @@ typedef struct
877 const char *out_args;
878 - dbus_bool_t (* handler) (DBusConnection *connection,
879 - BusTransaction *transaction,
880 - DBusMessage *message,
882 + BusResult (* handler) (DBusConnection *connection,
883 + BusTransaction *transaction,
884 + DBusMessage *message,
889 @@ -2511,7 +2517,7 @@ static const PropertyHandler dbus_property_handlers[] = {
893 -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
894 +static BusResult bus_driver_handle_introspect (DBusConnection *,
895 BusTransaction *, DBusMessage *, DBusError *);
897 static const MessageHandler properties_message_handlers[] = {
898 @@ -2763,7 +2769,7 @@ bus_driver_generate_introspect_string (DBusString *xml,
904 bus_driver_handle_introspect (DBusConnection *connection,
905 BusTransaction *transaction,
906 DBusMessage *message,
907 @@ -2784,13 +2790,13 @@ bus_driver_handle_introspect (DBusConnection *connection,
910 _DBUS_ASSERT_ERROR_IS_SET (error);
912 + return BUS_RESULT_FALSE;
915 if (!_dbus_string_init (&xml))
919 + return BUS_RESULT_FALSE;
922 is_canonical_path = dbus_message_has_path (message, DBUS_PATH_DBUS);
923 @@ -2815,7 +2821,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
924 dbus_message_unref (reply);
925 _dbus_string_free (&xml);
928 + return BUS_RESULT_TRUE;
932 @@ -2825,10 +2831,42 @@ bus_driver_handle_introspect (DBusConnection *connection,
934 _dbus_string_free (&xml);
937 + return BUS_RESULT_FALSE;
941 + * Set @error and return FALSE if the message is not directed to the
942 + * dbus-daemon by its canonical object path. This is hardening against
943 + * system services with poorly-written security policy files, which
944 + * might allow sending dangerously broad equivalence classes of messages
945 + * such as "anything with this assumed-to-be-safe object path".
947 + * dbus-daemon is unusual in that it normally ignores the object path
948 + * of incoming messages; we need to keep that behaviour for the "read"
949 + * read-only method calls like GetConnectionUnixUser for backwards
950 + * compatibility, but it seems safer to be more restrictive for things
951 + * intended to be root-only or privileged-developers-only.
953 + * It is possible that there are other system services with the same
954 + * quirk as dbus-daemon.
957 +bus_driver_check_message_is_for_us (DBusMessage *message,
960 + if (!dbus_message_has_path (message, DBUS_PATH_DBUS))
962 + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
963 + "Method '%s' is only available at the canonical object path '%s'",
964 + dbus_message_get_member (message), DBUS_PATH_DBUS);
973 bus_driver_handle_message (DBusConnection *connection,
974 BusTransaction *transaction,
975 DBusMessage *message,
976 @@ -2839,6 +2877,7 @@ bus_driver_handle_message (DBusConnection *connection,
977 const MessageHandler *mh;
978 dbus_bool_t found_interface = FALSE;
979 dbus_bool_t is_canonical_path;
982 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
984 @@ -2854,7 +2893,7 @@ bus_driver_handle_message (DBusConnection *connection,
989 + return BUS_RESULT_FALSE;
991 context = bus_connection_get_context (connection);
992 systemd = bus_driver_get_owner_of_name (connection,
993 @@ -2871,7 +2910,7 @@ bus_driver_handle_message (DBusConnection *connection,
994 attacker ? attacker : "(unauthenticated)",
995 bus_connection_get_loginfo (connection));
998 + return BUS_RESULT_TRUE;
1001 if (!bus_context_get_systemd_activation (context))
1002 @@ -2879,16 +2918,16 @@ bus_driver_handle_message (DBusConnection *connection,
1003 bus_context_log (context, DBUS_SYSTEM_LOG_WARNING,
1004 "Ignoring unexpected ActivationFailure message "
1005 "while not using systemd activation");
1007 + return BUS_RESULT_FALSE;
1010 - return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
1011 + return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
1014 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
1016 _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
1017 - return TRUE; /* we just ignore this */
1018 + return BUS_RESULT_TRUE; /* we just ignore this */
1021 /* may be NULL, which means "any interface will do" */
1022 @@ -2953,20 +2992,27 @@ bus_driver_handle_message (DBusConnection *connection,
1023 name, dbus_message_get_signature (message),
1025 _DBUS_ASSERT_ERROR_IS_SET (error);
1027 + return BUS_RESULT_FALSE;
1030 - if ((* mh->handler) (connection, transaction, message, error))
1031 + res = (* mh->handler) (connection, transaction, message, error);
1032 + if (res == BUS_RESULT_TRUE)
1034 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1035 _dbus_verbose ("Driver handler succeeded\n");
1037 + return BUS_RESULT_TRUE;
1040 + else if (res == BUS_RESULT_FALSE)
1042 _DBUS_ASSERT_ERROR_IS_SET (error);
1043 _dbus_verbose ("Driver handler returned failure\n");
1045 + return BUS_RESULT_FALSE;
1047 + else if (res == BUS_RESULT_LATER)
1049 + _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1050 + _dbus_verbose ("Driver handler delayed message processing due to policy check\n");
1051 + return BUS_RESULT_LATER;
1055 @@ -2978,7 +3024,7 @@ bus_driver_handle_message (DBusConnection *connection,
1056 "%s does not understand message %s",
1057 DBUS_SERVICE_DBUS, name);
1060 + return BUS_RESULT_FALSE;
1064 @@ -3099,7 +3145,7 @@ interface_handler_find_property (const InterfaceHandler *ih,
1070 bus_driver_handle_get (DBusConnection *connection,
1071 BusTransaction *transaction,
1072 DBusMessage *message,
1073 @@ -3120,18 +3166,18 @@ bus_driver_handle_get (DBusConnection *connection,
1074 DBUS_TYPE_STRING, &iface,
1075 DBUS_TYPE_STRING, &prop,
1078 + return BUS_RESULT_FALSE;
1080 /* We only implement Properties on /org/freedesktop/DBus so far. */
1081 ih = bus_driver_find_interface (iface, TRUE, error);
1085 + return BUS_RESULT_FALSE;
1087 handler = interface_handler_find_property (ih, prop, error);
1089 if (handler == NULL)
1091 + return BUS_RESULT_FALSE;
1093 context = bus_transaction_get_context (transaction);
1095 @@ -3159,17 +3205,17 @@ bus_driver_handle_get (DBusConnection *connection,
1098 dbus_message_unref (reply);
1100 + return BUS_RESULT_TRUE;
1104 dbus_message_unref (reply);
1106 BUS_SET_OOM (error);
1108 + return BUS_RESULT_FALSE;
1113 bus_driver_handle_get_all (DBusConnection *connection,
1114 BusTransaction *transaction,
1115 DBusMessage *message,
1116 @@ -3188,13 +3234,13 @@ bus_driver_handle_get_all (DBusConnection *connection,
1117 if (!dbus_message_get_args (message, error,
1118 DBUS_TYPE_STRING, &iface,
1121 + return BUS_RESULT_FALSE;
1123 /* We only implement Properties on /org/freedesktop/DBus so far. */
1124 ih = bus_driver_find_interface (iface, TRUE, error);
1128 + return BUS_RESULT_FALSE;
1130 context = bus_transaction_get_context (transaction);
1132 @@ -3229,7 +3275,7 @@ bus_driver_handle_get_all (DBusConnection *connection,
1135 dbus_message_unref (reply);
1137 + return BUS_RESULT_TRUE;
1139 oom_abandon_message:
1140 _dbus_asv_abandon (&reply_iter, &array_iter);
1141 @@ -3239,10 +3285,10 @@ oom:
1142 dbus_message_unref (reply);
1144 BUS_SET_OOM (error);
1146 + return BUS_RESULT_FALSE;
1151 bus_driver_handle_set (DBusConnection *connection,
1152 BusTransaction *transaction,
1153 DBusMessage *message,
1154 @@ -3271,15 +3317,15 @@ bus_driver_handle_set (DBusConnection *connection,
1155 ih = bus_driver_find_interface (iface, TRUE, error);
1159 + return BUS_RESULT_FALSE;
1161 handler = interface_handler_find_property (ih, prop, error);
1163 if (handler == NULL)
1165 + return BUS_RESULT_FALSE;
1167 /* We don't implement any properties that can be set yet. */
1168 dbus_set_error (error, DBUS_ERROR_PROPERTY_READ_ONLY,
1169 "Property '%s.%s' cannot be set", iface, prop);
1171 + return BUS_RESULT_FALSE;
1173 diff --git a/bus/driver.h b/bus/driver.h
1174 index a7297ad..05e9886 100644
1177 @@ -35,7 +35,7 @@ typedef enum
1180 void bus_driver_remove_connection (DBusConnection *connection);
1181 -dbus_bool_t bus_driver_handle_message (DBusConnection *connection,
1182 +BusResult bus_driver_handle_message (DBusConnection *connection,
1183 BusTransaction *transaction,
1184 DBusMessage *message,
1186 diff --git a/bus/policy.c b/bus/policy.c
1187 index 483cc97..f6f4d85 100644
1190 @@ -1390,18 +1390,21 @@ bus_client_policy_check_can_receive (BusClientPolicy *policy,
1196 bus_rules_check_can_own (DBusList *rules,
1197 - const DBusString *service_name)
1198 + const DBusString *service_name,
1199 + DBusConnection *connection,
1200 + DBusMessage *message)
1203 - dbus_bool_t allowed;
1205 + const char *privilege;
1207 /* rules is in the order the rules appeared
1208 * in the config file, i.e. last rule that applies wins
1212 + result = BUS_RESULT_FALSE;
1213 link = _dbus_list_get_first_link (&rules);
1214 while (link != NULL)
1216 @@ -1437,17 +1440,46 @@ bus_rules_check_can_own (DBusList *rules,
1220 - allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW;
1221 + switch (rule->access)
1223 + case BUS_POLICY_RULE_ACCESS_ALLOW:
1224 + result = BUS_RESULT_TRUE;
1227 + case BUS_POLICY_RULE_ACCESS_DENY:
1228 + result = BUS_RESULT_FALSE;
1230 + case BUS_POLICY_RULE_ACCESS_CHECK:
1231 + result = BUS_RESULT_LATER;
1232 + privilege = rule->privilege;
1238 + if (result == BUS_RESULT_LATER)
1240 + BusContext *context = bus_connection_get_context(connection);
1241 + BusCheck *check = bus_context_get_check(context);
1242 + BusDeferredMessage *deferred_message;
1244 + result = bus_check_privilege(check, message, connection, NULL, NULL,
1245 + privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message);
1246 + if (result == BUS_RESULT_LATER)
1248 + bus_deferred_message_disable_sender(deferred_message);
1257 bus_client_policy_check_can_own (BusClientPolicy *policy,
1258 - const DBusString *service_name)
1259 + const DBusString *service_name,
1260 + DBusConnection *connection,
1261 + DBusMessage *message)
1263 - return bus_rules_check_can_own (policy->rules, service_name);
1264 + return bus_rules_check_can_own (policy->rules, service_name, connection, message);
1267 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
1268 @@ -1455,7 +1487,7 @@ dbus_bool_t
1269 bus_policy_check_can_own (BusPolicy *policy,
1270 const DBusString *service_name)
1272 - return bus_rules_check_can_own (policy->default_rules, service_name);
1273 + return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL) == BUS_RESULT_TRUE;
1275 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
1277 diff --git a/bus/policy.h b/bus/policy.h
1278 index f839d23..28ce8f2 100644
1281 @@ -182,8 +182,10 @@ BusResult bus_client_policy_check_can_receive (BusClientPolicy *policy,
1282 dbus_int32_t *toggles,
1283 const char **privilege_param,
1284 BusDeferredMessage **deferred_message);
1285 -dbus_bool_t bus_client_policy_check_can_own (BusClientPolicy *policy,
1286 - const DBusString *service_name);
1287 +BusResult bus_client_policy_check_can_own (BusClientPolicy *policy,
1288 + const DBusString *service_name,
1289 + DBusConnection *connection,
1290 + DBusMessage *message);
1291 dbus_bool_t bus_client_policy_append_rule (BusClientPolicy *policy,
1292 BusPolicyRule *rule);
1293 void bus_client_policy_optimize (BusClientPolicy *policy);
1294 diff --git a/bus/services.c b/bus/services.c
1295 index 127edda..586af18 100644
1296 --- a/bus/services.c
1297 +++ b/bus/services.c
1298 @@ -376,16 +376,17 @@ bus_registry_list_services (BusRegistry *registry,
1304 bus_registry_acquire_service (BusRegistry *registry,
1305 DBusConnection *connection,
1306 + DBusMessage *message,
1307 const DBusString *service_name,
1308 dbus_uint32_t flags,
1309 dbus_uint32_t *result,
1310 BusTransaction *transaction,
1313 - dbus_bool_t retval;
1315 DBusConnection *old_owner_conn;
1316 BusClientPolicy *policy;
1317 BusService *service;
1318 @@ -393,8 +394,9 @@ bus_registry_acquire_service (BusRegistry *registry,
1320 BusOwner *primary_owner;
1325 + retval = BUS_RESULT_FALSE;
1327 if (!_dbus_validate_bus_name (service_name, 0,
1328 _dbus_string_get_length (service_name)))
1329 @@ -467,7 +469,8 @@ bus_registry_acquire_service (BusRegistry *registry,
1330 _dbus_string_get_const_data (service_name), error))
1333 - if (!bus_client_policy_check_can_own (policy, service_name))
1334 + res = bus_client_policy_check_can_own (policy, service_name, connection, message);
1335 + if (res == BUS_RESULT_FALSE)
1337 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1338 "Connection \"%s\" is not allowed to own the service \"%s\" due "
1339 @@ -478,6 +481,11 @@ bus_registry_acquire_service (BusRegistry *registry,
1340 _dbus_string_get_const_data (service_name));
1343 + else if (res == BUS_RESULT_LATER)
1345 + retval = BUS_RESULT_LATER;
1349 limit = bus_context_get_max_services_per_connection (registry->context);
1351 @@ -603,11 +611,13 @@ bus_registry_acquire_service (BusRegistry *registry,
1354 activation = bus_context_get_activation (registry->context);
1355 - retval = bus_activation_send_pending_auto_activation_messages (activation,
1357 + if (bus_activation_send_pending_auto_activation_messages (activation,
1361 - BUS_SET_OOM (error);
1363 + retval = BUS_RESULT_TRUE;
1365 + BUS_SET_OOM (error);
1369 diff --git a/bus/services.h b/bus/services.h
1370 index 056dd9f..3df3dd7 100644
1371 --- a/bus/services.h
1372 +++ b/bus/services.h
1373 @@ -50,8 +50,9 @@ void bus_registry_foreach (BusRegistry *registry
1374 dbus_bool_t bus_registry_list_services (BusRegistry *registry,
1377 -dbus_bool_t bus_registry_acquire_service (BusRegistry *registry,
1378 +BusResult bus_registry_acquire_service (BusRegistry *registry,
1379 DBusConnection *connection,
1380 + DBusMessage *message,
1381 const DBusString *service_name,
1382 dbus_uint32_t flags,
1383 dbus_uint32_t *result,
1384 diff --git a/bus/stats.c b/bus/stats.c
1385 index 1582255..c25be98 100644
1390 #ifdef DBUS_ENABLE_STATS
1394 bus_stats_handle_get_stats (DBusConnection *connection,
1395 BusTransaction *transaction,
1396 DBusMessage *message,
1397 @@ -51,6 +51,9 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1399 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1401 + if (!bus_driver_check_message_is_for_us (message, error))
1402 + return BUS_RESULT_FALSE;
1404 context = bus_transaction_get_context (transaction);
1405 connections = bus_context_get_connections (context);
1407 @@ -104,17 +107,17 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1410 dbus_message_unref (reply);
1412 + return BUS_RESULT_TRUE;
1416 dbus_message_unref (reply);
1418 BUS_SET_OOM (error);
1420 + return BUS_RESULT_FALSE;
1425 bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1426 BusTransaction *transaction,
1427 DBusMessage *message,
1428 @@ -209,7 +212,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1431 dbus_message_unref (reply);
1433 + return BUS_RESULT_TRUE;
1436 BUS_SET_OOM (error);
1437 @@ -218,11 +221,11 @@ failed:
1439 dbus_message_unref (reply);
1442 + return BUS_RESULT_FALSE;
1448 bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1449 BusTransaction *transaction,
1450 DBusMessage *message,
1451 @@ -246,7 +249,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1452 matchmaker = bus_context_get_matchmaker (context);
1454 if (!bus_registry_list_services (registry, &services, &services_len))
1456 + return BUS_RESULT_FALSE;
1458 reply = dbus_message_new_method_return (message);
1460 @@ -325,7 +328,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1462 dbus_message_unref (reply);
1463 dbus_free_string_array (services);
1465 + return BUS_RESULT_TRUE;
1469 @@ -334,7 +337,7 @@ oom:
1470 dbus_free_string_array (services);
1472 BUS_SET_OOM (error);
1474 + return BUS_RESULT_FALSE;
1478 diff --git a/bus/stats.h b/bus/stats.h
1479 index dcb022c..683fa17 100644
1484 #define BUS_INTERFACE_STATS "org.freedesktop.DBus.Debug.Stats"
1486 -dbus_bool_t bus_stats_handle_get_stats (DBusConnection *connection,
1487 +BusResult bus_stats_handle_get_stats (DBusConnection *connection,
1488 BusTransaction *transaction,
1489 DBusMessage *message,
1492 -dbus_bool_t bus_stats_handle_get_connection_stats (DBusConnection *connection,
1493 +BusResult bus_stats_handle_get_connection_stats (DBusConnection *connection,
1494 BusTransaction *transaction,
1495 DBusMessage *message,
1498 -dbus_bool_t bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1499 +BusResult bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1500 BusTransaction *transaction,
1501 DBusMessage *message,