1 From e7ae85429aa3e6d80df13b3a5a492d9ccbf42518 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: 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 diff --git a/bus/dispatch.c b/bus/dispatch.c
26 index 7d30ce4..4b84c21 100644
29 @@ -517,8 +517,17 @@ bus_dispatch (DBusConnection *connection,
32 _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
33 - if (!bus_driver_handle_message (connection, transaction, message, &error))
34 + res = bus_driver_handle_message (connection, transaction, message, &error);
35 + if (res == BUS_RESULT_FALSE)
37 + else if (res == BUS_RESULT_LATER)
39 + /* connection has been disabled in message handler */
40 + bus_transaction_cancel_and_free (transaction);
42 + result = DBUS_HANDLER_RESULT_LATER;
46 else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
48 diff --git a/bus/driver.c b/bus/driver.c
49 index d89a658..aaeb3b2 100644
52 @@ -420,7 +420,7 @@ create_unique_client_name (BusRegistry *registry,
58 bus_driver_handle_hello (DBusConnection *connection,
59 BusTransaction *transaction,
61 @@ -428,7 +428,7 @@ bus_driver_handle_hello (DBusConnection *connection,
63 DBusString unique_name;
67 BusRegistry *registry;
68 BusConnections *connections;
70 @@ -442,7 +442,7 @@ bus_driver_handle_hello (DBusConnection *connection,
71 /* We already handled an Hello message for this connection. */
72 dbus_set_error (error, DBUS_ERROR_FAILED,
73 "Already handled an Hello message");
75 + return BUS_RESULT_FALSE;
78 /* Note that when these limits are exceeded we don't disconnect the
79 @@ -464,16 +464,16 @@ bus_driver_handle_hello (DBusConnection *connection,
80 bus_context_log (context, DBUS_SYSTEM_LOG_WARNING, "%s (%s=%d)",
81 tmp_error.message, limit_name, limit);
82 dbus_move_error (&tmp_error, error);
84 + return BUS_RESULT_FALSE;
87 if (!_dbus_string_init (&unique_name))
91 + return BUS_RESULT_FALSE;
95 + retval = BUS_RESULT_FALSE;
97 registry = bus_connection_get_registry (connection);
99 @@ -506,7 +506,7 @@ bus_driver_handle_hello (DBusConnection *connection,
102 _dbus_assert (bus_connection_is_active (connection));
104 + retval = BUS_RESULT_TRUE;
107 _dbus_string_free (&unique_name);
108 @@ -558,7 +558,7 @@ bus_driver_send_welcome_message (DBusConnection *connection,
114 bus_driver_handle_list_services (DBusConnection *connection,
115 BusTransaction *transaction,
116 DBusMessage *message,
117 @@ -580,14 +580,14 @@ bus_driver_handle_list_services (DBusConnection *connection,
122 + return BUS_RESULT_FALSE;
125 if (!bus_registry_list_services (registry, &services, &len))
127 dbus_message_unref (reply);
130 + return BUS_RESULT_FALSE;
133 dbus_message_iter_init_append (reply, &iter);
134 @@ -599,7 +599,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
135 dbus_free_string_array (services);
136 dbus_message_unref (reply);
139 + return BUS_RESULT_FALSE;
143 @@ -611,7 +611,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
144 dbus_free_string_array (services);
145 dbus_message_unref (reply);
148 + return BUS_RESULT_FALSE;
152 @@ -624,7 +624,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
153 dbus_free_string_array (services);
154 dbus_message_unref (reply);
157 + return BUS_RESULT_FALSE;
161 @@ -635,23 +635,23 @@ bus_driver_handle_list_services (DBusConnection *connection,
163 dbus_message_unref (reply);
166 + return BUS_RESULT_FALSE;
169 if (!bus_transaction_send_from_driver (transaction, connection, reply))
171 dbus_message_unref (reply);
174 + return BUS_RESULT_FALSE;
178 dbus_message_unref (reply);
180 + return BUS_RESULT_TRUE;
186 bus_driver_handle_list_activatable_services (DBusConnection *connection,
187 BusTransaction *transaction,
188 DBusMessage *message,
189 @@ -673,14 +673,14 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
194 + return BUS_RESULT_FALSE;
197 if (!bus_activation_list_services (activation, &services, &len))
199 dbus_message_unref (reply);
202 + return BUS_RESULT_FALSE;
205 dbus_message_iter_init_append (reply, &iter);
206 @@ -692,7 +692,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
207 dbus_free_string_array (services);
208 dbus_message_unref (reply);
211 + return BUS_RESULT_FALSE;
215 @@ -704,7 +704,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
216 dbus_free_string_array (services);
217 dbus_message_unref (reply);
220 + return BUS_RESULT_FALSE;
224 @@ -717,7 +717,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
225 dbus_free_string_array (services);
226 dbus_message_unref (reply);
229 + return BUS_RESULT_FALSE;
233 @@ -728,23 +728,23 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
235 dbus_message_unref (reply);
238 + return BUS_RESULT_FALSE;
241 if (!bus_transaction_send_from_driver (transaction, connection, reply))
243 dbus_message_unref (reply);
246 + return BUS_RESULT_FALSE;
250 dbus_message_unref (reply);
252 + return BUS_RESULT_TRUE;
258 bus_driver_handle_acquire_service (DBusConnection *connection,
259 BusTransaction *transaction,
260 DBusMessage *message,
261 @@ -755,7 +755,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
263 dbus_uint32_t service_reply;
265 - dbus_bool_t retval;
268 BusRegistry *registry;
270 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
271 @@ -766,20 +767,24 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
272 DBUS_TYPE_STRING, &name,
273 DBUS_TYPE_UINT32, &flags,
276 + return BUS_RESULT_FALSE;
278 _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
281 + retval = BUS_RESULT_FALSE;
284 _dbus_string_init_const (&service_name, name);
286 - if (!bus_registry_acquire_service (registry, connection,
287 - &service_name, flags,
288 - &service_reply, transaction,
291 + res = bus_registry_acquire_service (registry, connection, message,
292 + &service_name, flags,
293 + &service_reply, transaction,
295 + if (res != BUS_RESULT_TRUE)
301 reply = dbus_message_new_method_return (message);
303 @@ -800,7 +805,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
308 + retval = BUS_RESULT_TRUE;
312 @@ -808,7 +813,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
318 bus_driver_handle_release_service (DBusConnection *connection,
319 BusTransaction *transaction,
320 DBusMessage *message,
321 @@ -818,7 +823,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
322 DBusString service_name;
324 dbus_uint32_t service_reply;
325 - dbus_bool_t retval;
327 BusRegistry *registry;
329 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
330 @@ -828,11 +833,11 @@ bus_driver_handle_release_service (DBusConnection *connection,
331 if (!dbus_message_get_args (message, error,
332 DBUS_TYPE_STRING, &name,
335 + return BUS_RESULT_FALSE;
337 _dbus_verbose ("Trying to release name %s\n", name);
340 + retval = BUS_RESULT_FALSE;
343 _dbus_string_init_const (&service_name, name);
344 @@ -861,7 +866,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
349 + retval = BUS_RESULT_TRUE;
353 @@ -869,7 +874,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
359 bus_driver_handle_service_exists (DBusConnection *connection,
360 BusTransaction *transaction,
361 DBusMessage *message,
362 @@ -880,7 +885,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
364 dbus_bool_t service_exists;
366 - dbus_bool_t retval;
368 BusRegistry *registry;
370 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
371 @@ -890,9 +895,9 @@ bus_driver_handle_service_exists (DBusConnection *connection,
372 if (!dbus_message_get_args (message, error,
373 DBUS_TYPE_STRING, &name,
376 + return BUS_RESULT_FALSE;
379 + retval = BUS_RESULT_FALSE;
381 if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
383 @@ -926,7 +931,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
388 + retval = BUS_RESULT_TRUE;
392 @@ -935,7 +940,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
398 bus_driver_handle_activate_service (DBusConnection *connection,
399 BusTransaction *transaction,
400 DBusMessage *message,
401 @@ -943,7 +948,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
405 - dbus_bool_t retval;
407 BusActivation *activation;
409 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
410 @@ -957,10 +962,10 @@ bus_driver_handle_activate_service (DBusConnection *connection,
412 _DBUS_ASSERT_ERROR_IS_SET (error);
413 _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
415 + return BUS_RESULT_FALSE;
419 + retval = BUS_RESULT_FALSE;
421 if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
422 message, name, error))
423 @@ -970,7 +975,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
428 + retval = BUS_RESULT_TRUE;
432 @@ -1072,13 +1077,13 @@ bus_driver_send_or_activate (BusTransaction *transaction,
438 bus_driver_handle_update_activation_environment (DBusConnection *connection,
439 BusTransaction *transaction,
440 DBusMessage *message,
443 - dbus_bool_t retval;
445 BusActivation *activation;
447 DBusMessageIter iter;
448 @@ -1100,7 +1105,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
449 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
450 "Cannot change activation environment "
453 + return BUS_RESULT_FALSE;
456 activation = bus_connection_get_activation (connection);
457 @@ -1114,7 +1119,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
459 dbus_message_iter_recurse (&iter, &dict_iter);
462 + retval = BUS_RESULT_FALSE;
463 systemd_message = NULL;
465 /* Then loop through the sent dictionary, add the location of
466 @@ -1279,7 +1284,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
467 if (!bus_driver_send_ack_reply (connection, transaction, message, error))
471 + retval = BUS_RESULT_TRUE;
474 if (systemd_message != NULL)
475 @@ -1289,7 +1294,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
481 bus_driver_handle_add_match (DBusConnection *connection,
482 BusTransaction *transaction,
483 DBusMessage *message,
484 @@ -1371,16 +1376,16 @@ bus_driver_handle_add_match (DBusConnection *connection,
486 bus_match_rule_unref (rule);
489 + return BUS_RESULT_TRUE;
492 _DBUS_ASSERT_ERROR_IS_SET (error);
494 bus_match_rule_unref (rule);
496 + return BUS_RESULT_FALSE;
501 bus_driver_handle_remove_match (DBusConnection *connection,
502 BusTransaction *transaction,
503 DBusMessage *message,
504 @@ -1423,16 +1428,16 @@ bus_driver_handle_remove_match (DBusConnection *connection,
506 bus_match_rule_unref (rule);
509 + return BUS_RESULT_TRUE;
512 _DBUS_ASSERT_ERROR_IS_SET (error);
514 bus_match_rule_unref (rule);
516 + return BUS_RESULT_FALSE;
521 bus_driver_handle_get_service_owner (DBusConnection *connection,
522 BusTransaction *transaction,
523 DBusMessage *message,
524 @@ -1502,7 +1507,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
526 dbus_message_unref (reply);
529 + return BUS_RESULT_TRUE;
533 @@ -1511,10 +1516,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
534 _DBUS_ASSERT_ERROR_IS_SET (error);
536 dbus_message_unref (reply);
538 + return BUS_RESULT_FALSE;
543 bus_driver_handle_list_queued_owners (DBusConnection *connection,
544 BusTransaction *transaction,
545 DBusMessage *message,
546 @@ -1606,7 +1611,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
548 dbus_message_unref (reply);
551 + return BUS_RESULT_TRUE;
555 @@ -1619,10 +1624,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
557 _dbus_list_clear (&base_names);
560 + return BUS_RESULT_FALSE;
565 bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
566 BusTransaction *transaction,
567 DBusMessage *message,
568 @@ -1679,7 +1684,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
570 dbus_message_unref (reply);
573 + return BUS_RESULT_TRUE;
577 @@ -1688,10 +1693,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
578 _DBUS_ASSERT_ERROR_IS_SET (error);
580 dbus_message_unref (reply);
582 + return BUS_RESULT_FALSE;
587 bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
588 BusTransaction *transaction,
589 DBusMessage *message,
590 @@ -1748,7 +1753,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
592 dbus_message_unref (reply);
595 + return BUS_RESULT_TRUE;
599 @@ -1757,10 +1762,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
600 _DBUS_ASSERT_ERROR_IS_SET (error);
602 dbus_message_unref (reply);
604 + return BUS_RESULT_FALSE;
609 bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
610 BusTransaction *transaction,
611 DBusMessage *message,
612 @@ -1811,7 +1816,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
614 dbus_message_unref (reply);
617 + return BUS_RESULT_TRUE;
621 @@ -1820,10 +1825,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
622 _DBUS_ASSERT_ERROR_IS_SET (error);
624 dbus_message_unref (reply);
626 + return BUS_RESULT_FALSE;
631 bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
632 BusTransaction *transaction,
633 DBusMessage *message,
634 @@ -1872,7 +1877,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
636 dbus_message_unref (reply);
639 + return BUS_RESULT_TRUE;
643 @@ -1881,10 +1886,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
644 _DBUS_ASSERT_ERROR_IS_SET (error);
646 dbus_message_unref (reply);
648 + return BUS_RESULT_FALSE;
653 bus_driver_handle_get_connection_credentials (DBusConnection *connection,
654 BusTransaction *transaction,
655 DBusMessage *message,
656 @@ -1998,7 +2003,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
658 dbus_message_unref (reply);
661 + return BUS_RESULT_TRUE;
665 @@ -2012,10 +2017,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
666 dbus_message_unref (reply);
670 + return BUS_RESULT_FALSE;
675 bus_driver_handle_reload_config (DBusConnection *connection,
676 BusTransaction *transaction,
677 DBusMessage *message,
678 @@ -2040,7 +2045,7 @@ bus_driver_handle_reload_config (DBusConnection *connection,
681 dbus_message_unref (reply);
683 + return BUS_RESULT_TRUE;
687 @@ -2049,11 +2054,11 @@ bus_driver_handle_reload_config (DBusConnection *connection,
688 _DBUS_ASSERT_ERROR_IS_SET (error);
690 dbus_message_unref (reply);
692 + return BUS_RESULT_FALSE;
695 #ifdef DBUS_ENABLE_VERBOSE_MODE
698 bus_driver_handle_enable_verbose (DBusConnection *connection,
699 BusTransaction *transaction,
700 DBusMessage *message,
701 @@ -2073,7 +2078,7 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
702 _dbus_set_verbose(TRUE);
704 dbus_message_unref (reply);
706 + return BUS_RESULT_TRUE;
709 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
710 @@ -2082,10 +2087,10 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
713 dbus_message_unref (reply);
715 + return BUS_RESULT_FALSE;
720 bus_driver_handle_disable_verbose (DBusConnection *connection,
721 BusTransaction *transaction,
722 DBusMessage *message,
723 @@ -2105,7 +2110,7 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
724 _dbus_set_verbose(FALSE);
726 dbus_message_unref (reply);
728 + return BUS_RESULT_TRUE;
731 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
732 @@ -2114,11 +2119,11 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
735 dbus_message_unref (reply);
737 + return BUS_RESULT_FALSE;
743 bus_driver_handle_get_id (DBusConnection *connection,
744 BusTransaction *transaction,
745 DBusMessage *message,
746 @@ -2134,7 +2139,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
747 if (!_dbus_string_init (&uuid))
751 + return BUS_RESULT_FALSE;
755 @@ -2160,7 +2165,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
757 _dbus_string_free (&uuid);
758 dbus_message_unref (reply);
760 + return BUS_RESULT_TRUE;
763 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
764 @@ -2170,10 +2175,10 @@ bus_driver_handle_get_id (DBusConnection *connection,
766 dbus_message_unref (reply);
767 _dbus_string_free (&uuid);
769 + return BUS_RESULT_FALSE;
774 bus_driver_handle_become_monitor (DBusConnection *connection,
775 BusTransaction *transaction,
776 DBusMessage *message,
777 @@ -2189,7 +2194,7 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
781 - dbus_bool_t ret = FALSE;
782 + BusResult ret = BUS_RESULT_FALSE;
784 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
786 @@ -2262,10 +2267,10 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
787 if (!bus_connection_be_monitor (connection, transaction, &rules, error))
791 + ret = BUS_RESULT_TRUE;
795 + if (ret == BUS_RESULT_TRUE)
796 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
798 _DBUS_ASSERT_ERROR_IS_SET (error);
799 @@ -2281,7 +2286,7 @@ out:
805 bus_driver_handle_get_machine_id (DBusConnection *connection,
806 BusTransaction *transaction,
807 DBusMessage *message,
808 @@ -2296,7 +2301,7 @@ bus_driver_handle_get_machine_id (DBusConnection *connection,
809 if (!_dbus_string_init (&uuid))
813 + return BUS_RESULT_FALSE;
816 if (!_dbus_get_local_machine_uuid_encoded (&uuid, error))
817 @@ -2321,7 +2326,7 @@ bus_driver_handle_get_machine_id (DBusConnection *connection,
819 _dbus_string_free (&uuid);
820 dbus_message_unref (reply);
822 + return BUS_RESULT_TRUE;
825 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
826 @@ -2335,29 +2340,30 @@ fail:
827 dbus_message_unref (reply);
829 _dbus_string_free (&uuid);
831 + return BUS_RESULT_FALSE;
836 bus_driver_handle_ping (DBusConnection *connection,
837 BusTransaction *transaction,
838 DBusMessage *message,
841 - return bus_driver_send_ack_reply (connection, transaction, message, error);
842 + return bus_driver_send_ack_reply (connection, transaction, message, error) == TRUE
843 + ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
846 -static dbus_bool_t bus_driver_handle_get (DBusConnection *connection,
847 +static BusResult bus_driver_handle_get (DBusConnection *connection,
848 BusTransaction *transaction,
849 DBusMessage *message,
852 -static dbus_bool_t bus_driver_handle_get_all (DBusConnection *connection,
853 +static BusResult bus_driver_handle_get_all (DBusConnection *connection,
854 BusTransaction *transaction,
855 DBusMessage *message,
858 -static dbus_bool_t bus_driver_handle_set (DBusConnection *connection,
859 +static BusResult bus_driver_handle_set (DBusConnection *connection,
860 BusTransaction *transaction,
861 DBusMessage *message,
863 @@ -2389,10 +2395,10 @@ typedef struct
866 const char *out_args;
867 - dbus_bool_t (* handler) (DBusConnection *connection,
868 - BusTransaction *transaction,
869 - DBusMessage *message,
871 + BusResult (* handler) (DBusConnection *connection,
872 + BusTransaction *transaction,
873 + DBusMessage *message,
878 @@ -2511,7 +2517,7 @@ static const PropertyHandler dbus_property_handlers[] = {
882 -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
883 +static BusResult bus_driver_handle_introspect (DBusConnection *,
884 BusTransaction *, DBusMessage *, DBusError *);
886 static const MessageHandler properties_message_handlers[] = {
887 @@ -2763,7 +2769,7 @@ bus_driver_generate_introspect_string (DBusString *xml,
893 bus_driver_handle_introspect (DBusConnection *connection,
894 BusTransaction *transaction,
895 DBusMessage *message,
896 @@ -2784,13 +2790,13 @@ bus_driver_handle_introspect (DBusConnection *connection,
899 _DBUS_ASSERT_ERROR_IS_SET (error);
901 + return BUS_RESULT_FALSE;
904 if (!_dbus_string_init (&xml))
908 + return BUS_RESULT_FALSE;
911 is_canonical_path = dbus_message_has_path (message, DBUS_PATH_DBUS);
912 @@ -2815,7 +2821,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
913 dbus_message_unref (reply);
914 _dbus_string_free (&xml);
917 + return BUS_RESULT_TRUE;
921 @@ -2825,10 +2831,42 @@ bus_driver_handle_introspect (DBusConnection *connection,
923 _dbus_string_free (&xml);
926 + return BUS_RESULT_FALSE;
930 + * Set @error and return FALSE if the message is not directed to the
931 + * dbus-daemon by its canonical object path. This is hardening against
932 + * system services with poorly-written security policy files, which
933 + * might allow sending dangerously broad equivalence classes of messages
934 + * such as "anything with this assumed-to-be-safe object path".
936 + * dbus-daemon is unusual in that it normally ignores the object path
937 + * of incoming messages; we need to keep that behaviour for the "read"
938 + * read-only method calls like GetConnectionUnixUser for backwards
939 + * compatibility, but it seems safer to be more restrictive for things
940 + * intended to be root-only or privileged-developers-only.
942 + * It is possible that there are other system services with the same
943 + * quirk as dbus-daemon.
946 +bus_driver_check_message_is_for_us (DBusMessage *message,
949 + if (!dbus_message_has_path (message, DBUS_PATH_DBUS))
951 + dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
952 + "Method '%s' is only available at the canonical object path '%s'",
953 + dbus_message_get_member (message), DBUS_PATH_DBUS);
962 bus_driver_handle_message (DBusConnection *connection,
963 BusTransaction *transaction,
964 DBusMessage *message,
965 @@ -2839,6 +2877,7 @@ bus_driver_handle_message (DBusConnection *connection,
966 const MessageHandler *mh;
967 dbus_bool_t found_interface = FALSE;
968 dbus_bool_t is_canonical_path;
971 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
973 @@ -2854,7 +2893,7 @@ bus_driver_handle_message (DBusConnection *connection,
978 + return BUS_RESULT_FALSE;
980 context = bus_connection_get_context (connection);
981 systemd = bus_driver_get_owner_of_name (connection,
982 @@ -2871,7 +2910,7 @@ bus_driver_handle_message (DBusConnection *connection,
983 attacker ? attacker : "(unauthenticated)",
984 bus_connection_get_loginfo (connection));
987 + return BUS_RESULT_TRUE;
990 if (!bus_context_get_systemd_activation (context))
991 @@ -2879,16 +2918,16 @@ bus_driver_handle_message (DBusConnection *connection,
992 bus_context_log (context, DBUS_SYSTEM_LOG_WARNING,
993 "Ignoring unexpected ActivationFailure message "
994 "while not using systemd activation");
996 + return BUS_RESULT_FALSE;
999 - return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
1000 + return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
1003 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
1005 _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
1006 - return TRUE; /* we just ignore this */
1007 + return BUS_RESULT_TRUE; /* we just ignore this */
1010 /* may be NULL, which means "any interface will do" */
1011 @@ -2953,20 +2992,27 @@ bus_driver_handle_message (DBusConnection *connection,
1012 name, dbus_message_get_signature (message),
1014 _DBUS_ASSERT_ERROR_IS_SET (error);
1016 + return BUS_RESULT_FALSE;
1019 - if ((* mh->handler) (connection, transaction, message, error))
1020 + res = (* mh->handler) (connection, transaction, message, error);
1021 + if (res == BUS_RESULT_TRUE)
1023 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1024 _dbus_verbose ("Driver handler succeeded\n");
1026 + return BUS_RESULT_TRUE;
1029 + else if (res == BUS_RESULT_FALSE)
1031 _DBUS_ASSERT_ERROR_IS_SET (error);
1032 _dbus_verbose ("Driver handler returned failure\n");
1034 + return BUS_RESULT_FALSE;
1036 + else if (res == BUS_RESULT_LATER)
1038 + _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1039 + _dbus_verbose ("Driver handler delayed message processing due to policy check\n");
1040 + return BUS_RESULT_LATER;
1044 @@ -2978,7 +3024,7 @@ bus_driver_handle_message (DBusConnection *connection,
1045 "%s does not understand message %s",
1046 DBUS_SERVICE_DBUS, name);
1049 + return BUS_RESULT_FALSE;
1053 @@ -3099,7 +3145,7 @@ interface_handler_find_property (const InterfaceHandler *ih,
1059 bus_driver_handle_get (DBusConnection *connection,
1060 BusTransaction *transaction,
1061 DBusMessage *message,
1062 @@ -3120,18 +3166,18 @@ bus_driver_handle_get (DBusConnection *connection,
1063 DBUS_TYPE_STRING, &iface,
1064 DBUS_TYPE_STRING, &prop,
1067 + return BUS_RESULT_FALSE;
1069 /* We only implement Properties on /org/freedesktop/DBus so far. */
1070 ih = bus_driver_find_interface (iface, TRUE, error);
1074 + return BUS_RESULT_FALSE;
1076 handler = interface_handler_find_property (ih, prop, error);
1078 if (handler == NULL)
1080 + return BUS_RESULT_FALSE;
1082 context = bus_transaction_get_context (transaction);
1084 @@ -3159,17 +3205,17 @@ bus_driver_handle_get (DBusConnection *connection,
1087 dbus_message_unref (reply);
1089 + return BUS_RESULT_TRUE;
1093 dbus_message_unref (reply);
1095 BUS_SET_OOM (error);
1097 + return BUS_RESULT_FALSE;
1102 bus_driver_handle_get_all (DBusConnection *connection,
1103 BusTransaction *transaction,
1104 DBusMessage *message,
1105 @@ -3188,13 +3234,13 @@ bus_driver_handle_get_all (DBusConnection *connection,
1106 if (!dbus_message_get_args (message, error,
1107 DBUS_TYPE_STRING, &iface,
1110 + return BUS_RESULT_FALSE;
1112 /* We only implement Properties on /org/freedesktop/DBus so far. */
1113 ih = bus_driver_find_interface (iface, TRUE, error);
1117 + return BUS_RESULT_FALSE;
1119 context = bus_transaction_get_context (transaction);
1121 @@ -3229,7 +3275,7 @@ bus_driver_handle_get_all (DBusConnection *connection,
1124 dbus_message_unref (reply);
1126 + return BUS_RESULT_TRUE;
1128 oom_abandon_message:
1129 _dbus_asv_abandon (&reply_iter, &array_iter);
1130 @@ -3239,10 +3285,10 @@ oom:
1131 dbus_message_unref (reply);
1133 BUS_SET_OOM (error);
1135 + return BUS_RESULT_FALSE;
1140 bus_driver_handle_set (DBusConnection *connection,
1141 BusTransaction *transaction,
1142 DBusMessage *message,
1143 @@ -3271,15 +3317,15 @@ bus_driver_handle_set (DBusConnection *connection,
1144 ih = bus_driver_find_interface (iface, TRUE, error);
1148 + return BUS_RESULT_FALSE;
1150 handler = interface_handler_find_property (ih, prop, error);
1152 if (handler == NULL)
1154 + return BUS_RESULT_FALSE;
1156 /* We don't implement any properties that can be set yet. */
1157 dbus_set_error (error, DBUS_ERROR_PROPERTY_READ_ONLY,
1158 "Property '%s.%s' cannot be set", iface, prop);
1160 + return BUS_RESULT_FALSE;
1162 diff --git a/bus/driver.h b/bus/driver.h
1163 index ac1289d..183c28b 100644
1166 @@ -35,7 +35,7 @@ typedef enum
1169 void bus_driver_remove_connection (DBusConnection *connection);
1170 -dbus_bool_t bus_driver_handle_message (DBusConnection *connection,
1171 +BusResult bus_driver_handle_message (DBusConnection *connection,
1172 BusTransaction *transaction,
1173 DBusMessage *message,
1175 diff --git a/bus/policy.c b/bus/policy.c
1176 index b1fab0d..27b66d1 100644
1179 @@ -1388,18 +1388,21 @@ bus_client_policy_check_can_receive (BusClientPolicy *policy,
1185 bus_rules_check_can_own (DBusList *rules,
1186 - const DBusString *service_name)
1187 + const DBusString *service_name,
1188 + DBusConnection *connection,
1189 + DBusMessage *message)
1192 - dbus_bool_t allowed;
1194 + const char *privilege;
1196 /* rules is in the order the rules appeared
1197 * in the config file, i.e. last rule that applies wins
1201 + result = BUS_RESULT_FALSE;
1202 link = _dbus_list_get_first_link (&rules);
1203 while (link != NULL)
1205 @@ -1435,17 +1438,45 @@ bus_rules_check_can_own (DBusList *rules,
1209 - allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW;
1210 + switch (rule->access)
1212 + case BUS_POLICY_RULE_ACCESS_ALLOW:
1213 + result = BUS_RESULT_TRUE;
1215 + case BUS_POLICY_RULE_ACCESS_DENY:
1216 + result = BUS_RESULT_FALSE;
1218 + case BUS_POLICY_RULE_ACCESS_CHECK:
1219 + result = BUS_RESULT_LATER;
1220 + privilege = rule->privilege;
1226 + if (result == BUS_RESULT_LATER)
1228 + BusContext *context = bus_connection_get_context(connection);
1229 + BusCheck *check = bus_context_get_check(context);
1230 + BusDeferredMessage *deferred_message;
1232 + result = bus_check_privilege(check, message, connection, NULL, NULL,
1233 + privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message);
1234 + if (result == BUS_RESULT_LATER)
1236 + bus_deferred_message_disable_sender(deferred_message);
1245 bus_client_policy_check_can_own (BusClientPolicy *policy,
1246 - const DBusString *service_name)
1247 + const DBusString *service_name,
1248 + DBusConnection *connection,
1249 + DBusMessage *message)
1251 - return bus_rules_check_can_own (policy->rules, service_name);
1252 + return bus_rules_check_can_own (policy->rules, service_name, connection, message);
1255 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
1256 @@ -1453,7 +1484,7 @@ dbus_bool_t
1257 bus_policy_check_can_own (BusPolicy *policy,
1258 const DBusString *service_name)
1260 - return bus_rules_check_can_own (policy->default_rules, service_name);
1261 + return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL) == BUS_RESULT_TRUE;
1263 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
1265 diff --git a/bus/policy.h b/bus/policy.h
1266 index f839d23..28ce8f2 100644
1269 @@ -182,8 +182,10 @@ BusResult bus_client_policy_check_can_receive (BusClientPolicy *policy,
1270 dbus_int32_t *toggles,
1271 const char **privilege_param,
1272 BusDeferredMessage **deferred_message);
1273 -dbus_bool_t bus_client_policy_check_can_own (BusClientPolicy *policy,
1274 - const DBusString *service_name);
1275 +BusResult bus_client_policy_check_can_own (BusClientPolicy *policy,
1276 + const DBusString *service_name,
1277 + DBusConnection *connection,
1278 + DBusMessage *message);
1279 dbus_bool_t bus_client_policy_append_rule (BusClientPolicy *policy,
1280 BusPolicyRule *rule);
1281 void bus_client_policy_optimize (BusClientPolicy *policy);
1282 diff --git a/bus/services.c b/bus/services.c
1283 index 127edda..586af18 100644
1284 --- a/bus/services.c
1285 +++ b/bus/services.c
1286 @@ -376,16 +376,17 @@ bus_registry_list_services (BusRegistry *registry,
1292 bus_registry_acquire_service (BusRegistry *registry,
1293 DBusConnection *connection,
1294 + DBusMessage *message,
1295 const DBusString *service_name,
1296 dbus_uint32_t flags,
1297 dbus_uint32_t *result,
1298 BusTransaction *transaction,
1301 - dbus_bool_t retval;
1303 DBusConnection *old_owner_conn;
1304 BusClientPolicy *policy;
1305 BusService *service;
1306 @@ -393,8 +394,9 @@ bus_registry_acquire_service (BusRegistry *registry,
1308 BusOwner *primary_owner;
1313 + retval = BUS_RESULT_FALSE;
1315 if (!_dbus_validate_bus_name (service_name, 0,
1316 _dbus_string_get_length (service_name)))
1317 @@ -467,7 +469,8 @@ bus_registry_acquire_service (BusRegistry *registry,
1318 _dbus_string_get_const_data (service_name), error))
1321 - if (!bus_client_policy_check_can_own (policy, service_name))
1322 + res = bus_client_policy_check_can_own (policy, service_name, connection, message);
1323 + if (res == BUS_RESULT_FALSE)
1325 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1326 "Connection \"%s\" is not allowed to own the service \"%s\" due "
1327 @@ -478,6 +481,11 @@ bus_registry_acquire_service (BusRegistry *registry,
1328 _dbus_string_get_const_data (service_name));
1331 + else if (res == BUS_RESULT_LATER)
1333 + retval = BUS_RESULT_LATER;
1337 limit = bus_context_get_max_services_per_connection (registry->context);
1339 @@ -603,11 +611,13 @@ bus_registry_acquire_service (BusRegistry *registry,
1342 activation = bus_context_get_activation (registry->context);
1343 - retval = bus_activation_send_pending_auto_activation_messages (activation,
1345 + if (bus_activation_send_pending_auto_activation_messages (activation,
1349 - BUS_SET_OOM (error);
1351 + retval = BUS_RESULT_TRUE;
1353 + BUS_SET_OOM (error);
1357 diff --git a/bus/services.h b/bus/services.h
1358 index 056dd9f..3df3dd7 100644
1359 --- a/bus/services.h
1360 +++ b/bus/services.h
1361 @@ -50,8 +50,9 @@ void bus_registry_foreach (BusRegistry *registry
1362 dbus_bool_t bus_registry_list_services (BusRegistry *registry,
1365 -dbus_bool_t bus_registry_acquire_service (BusRegistry *registry,
1366 +BusResult bus_registry_acquire_service (BusRegistry *registry,
1367 DBusConnection *connection,
1368 + DBusMessage *message,
1369 const DBusString *service_name,
1370 dbus_uint32_t flags,
1371 dbus_uint32_t *result,
1372 diff --git a/bus/stats.c b/bus/stats.c
1373 index 1582255..c25be98 100644
1378 #ifdef DBUS_ENABLE_STATS
1382 bus_stats_handle_get_stats (DBusConnection *connection,
1383 BusTransaction *transaction,
1384 DBusMessage *message,
1385 @@ -51,6 +51,9 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1387 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1389 + if (!bus_driver_check_message_is_for_us (message, error))
1390 + return BUS_RESULT_FALSE;
1392 context = bus_transaction_get_context (transaction);
1393 connections = bus_context_get_connections (context);
1395 @@ -104,17 +107,17 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1398 dbus_message_unref (reply);
1400 + return BUS_RESULT_TRUE;
1404 dbus_message_unref (reply);
1406 BUS_SET_OOM (error);
1408 + return BUS_RESULT_FALSE;
1413 bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1414 BusTransaction *transaction,
1415 DBusMessage *message,
1416 @@ -209,7 +212,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1419 dbus_message_unref (reply);
1421 + return BUS_RESULT_TRUE;
1424 BUS_SET_OOM (error);
1425 @@ -218,11 +221,11 @@ failed:
1427 dbus_message_unref (reply);
1430 + return BUS_RESULT_FALSE;
1436 bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1437 BusTransaction *transaction,
1438 DBusMessage *message,
1439 @@ -246,7 +249,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1440 matchmaker = bus_context_get_matchmaker (context);
1442 if (!bus_registry_list_services (registry, &services, &services_len))
1444 + return BUS_RESULT_FALSE;
1446 reply = dbus_message_new_method_return (message);
1448 @@ -325,7 +328,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1450 dbus_message_unref (reply);
1451 dbus_free_string_array (services);
1453 + return BUS_RESULT_TRUE;
1457 @@ -334,7 +337,7 @@ oom:
1458 dbus_free_string_array (services);
1460 BUS_SET_OOM (error);
1462 + return BUS_RESULT_FALSE;
1466 diff --git a/bus/stats.h b/bus/stats.h
1467 index dcb022c..683fa17 100644
1472 #define BUS_INTERFACE_STATS "org.freedesktop.DBus.Debug.Stats"
1474 -dbus_bool_t bus_stats_handle_get_stats (DBusConnection *connection,
1475 +BusResult bus_stats_handle_get_stats (DBusConnection *connection,
1476 BusTransaction *transaction,
1477 DBusMessage *message,
1480 -dbus_bool_t bus_stats_handle_get_connection_stats (DBusConnection *connection,
1481 +BusResult bus_stats_handle_get_connection_stats (DBusConnection *connection,
1482 BusTransaction *transaction,
1483 DBusMessage *message,
1486 -dbus_bool_t bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1487 +BusResult bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1488 BusTransaction *transaction,
1489 DBusMessage *message,