1 From 35ef89cd6777ea2430077fc621d21bd01df92349 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 7/8] Add own rule result unavailability handling
6 Own rule result unavailability is handled like send rules - dispatching
7 messages from the sender is blocked and resumed when result becomes
10 Handler of "RequestName" method needs to return BUS_RESULT_LATER when
11 policy result is not known therefore its return type is modified.
12 Since bus message handlers are put into function pointer array other
13 message handler function singatures are also affected.
15 Change-Id: I4c2cbd4585e41fccd8a30f825a8f0d342ab56755
17 bus/dispatch.c | 11 ++-
18 bus/driver.c | 227 ++++++++++++++++++++++++++++++---------------------------
20 bus/policy.c | 51 ++++++++++---
22 bus/services.c | 26 +++++--
25 8 files changed, 204 insertions(+), 138 deletions(-)
27 diff --git a/bus/dispatch.c b/bus/dispatch.c
28 index 9972e76..d3b970f 100644
31 @@ -404,8 +404,17 @@ bus_dispatch (DBusConnection *connection,
34 _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
35 - if (!bus_driver_handle_message (connection, transaction, message, &error))
36 + res = bus_driver_handle_message (connection, transaction, message, &error);
37 + if (res == BUS_RESULT_FALSE)
39 + else if (res == BUS_RESULT_LATER)
41 + /* connection has been disabled in message handler */
42 + bus_transaction_cancel_and_free (transaction);
44 + result = DBUS_HANDLER_RESULT_LATER;
48 else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
50 diff --git a/bus/driver.c b/bus/driver.c
51 index 2fb1385..9708f49 100644
54 @@ -297,7 +297,7 @@ create_unique_client_name (BusRegistry *registry,
60 bus_driver_handle_hello (DBusConnection *connection,
61 BusTransaction *transaction,
63 @@ -305,7 +305,7 @@ bus_driver_handle_hello (DBusConnection *connection,
65 DBusString unique_name;
69 BusRegistry *registry;
70 BusConnections *connections;
72 @@ -316,7 +316,7 @@ bus_driver_handle_hello (DBusConnection *connection,
73 /* We already handled an Hello message for this connection. */
74 dbus_set_error (error, DBUS_ERROR_FAILED,
75 "Already handled an Hello message");
77 + return BUS_RESULT_FALSE;
80 /* Note that when these limits are exceeded we don't disconnect the
81 @@ -330,16 +330,16 @@ bus_driver_handle_hello (DBusConnection *connection,
84 _DBUS_ASSERT_ERROR_IS_SET (error);
86 + return BUS_RESULT_FALSE;
89 if (!_dbus_string_init (&unique_name))
93 + return BUS_RESULT_FALSE;
97 + retval = BUS_RESULT_FALSE;
99 registry = bus_connection_get_registry (connection);
101 @@ -372,7 +372,7 @@ bus_driver_handle_hello (DBusConnection *connection,
104 _dbus_assert (bus_connection_is_active (connection));
106 + retval = BUS_RESULT_TRUE;
109 _dbus_string_free (&unique_name);
110 @@ -424,7 +424,7 @@ bus_driver_send_welcome_message (DBusConnection *connection,
116 bus_driver_handle_list_services (DBusConnection *connection,
117 BusTransaction *transaction,
118 DBusMessage *message,
119 @@ -446,14 +446,14 @@ bus_driver_handle_list_services (DBusConnection *connection,
124 + return BUS_RESULT_FALSE;
127 if (!bus_registry_list_services (registry, &services, &len))
129 dbus_message_unref (reply);
132 + return BUS_RESULT_FALSE;
135 dbus_message_iter_init_append (reply, &iter);
136 @@ -465,7 +465,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
137 dbus_free_string_array (services);
138 dbus_message_unref (reply);
141 + return BUS_RESULT_FALSE;
145 @@ -477,7 +477,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 @@ -490,7 +490,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 @@ -501,23 +501,23 @@ bus_driver_handle_list_services (DBusConnection *connection,
165 dbus_message_unref (reply);
168 + return BUS_RESULT_FALSE;
171 if (!bus_transaction_send_from_driver (transaction, connection, reply))
173 dbus_message_unref (reply);
176 + return BUS_RESULT_FALSE;
180 dbus_message_unref (reply);
182 + return BUS_RESULT_TRUE;
188 bus_driver_handle_list_activatable_services (DBusConnection *connection,
189 BusTransaction *transaction,
190 DBusMessage *message,
191 @@ -539,14 +539,14 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
196 + return BUS_RESULT_FALSE;
199 if (!bus_activation_list_services (activation, &services, &len))
201 dbus_message_unref (reply);
204 + return BUS_RESULT_FALSE;
207 dbus_message_iter_init_append (reply, &iter);
208 @@ -558,7 +558,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
209 dbus_free_string_array (services);
210 dbus_message_unref (reply);
213 + return BUS_RESULT_FALSE;
217 @@ -570,7 +570,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 @@ -583,7 +583,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 @@ -594,23 +594,23 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
237 dbus_message_unref (reply);
240 + return BUS_RESULT_FALSE;
243 if (!bus_transaction_send_from_driver (transaction, connection, reply))
245 dbus_message_unref (reply);
248 + return BUS_RESULT_FALSE;
252 dbus_message_unref (reply);
254 + return BUS_RESULT_TRUE;
260 bus_driver_handle_acquire_service (DBusConnection *connection,
261 BusTransaction *transaction,
262 DBusMessage *message,
263 @@ -621,7 +621,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
265 dbus_uint32_t service_reply;
267 - dbus_bool_t retval;
270 BusRegistry *registry;
272 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
273 @@ -632,20 +633,24 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
274 DBUS_TYPE_STRING, &name,
275 DBUS_TYPE_UINT32, &flags,
278 + return BUS_RESULT_FALSE;
280 _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
283 + retval = BUS_RESULT_FALSE;
286 _dbus_string_init_const (&service_name, name);
288 - if (!bus_registry_acquire_service (registry, connection,
289 - &service_name, flags,
290 - &service_reply, transaction,
293 + res = bus_registry_acquire_service (registry, connection, message,
294 + &service_name, flags,
295 + &service_reply, transaction,
297 + if (res != BUS_RESULT_TRUE)
303 reply = dbus_message_new_method_return (message);
305 @@ -666,7 +671,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
310 + retval = BUS_RESULT_TRUE;
314 @@ -674,7 +679,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
320 bus_driver_handle_release_service (DBusConnection *connection,
321 BusTransaction *transaction,
322 DBusMessage *message,
323 @@ -684,7 +689,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
324 DBusString service_name;
326 dbus_uint32_t service_reply;
327 - dbus_bool_t retval;
329 BusRegistry *registry;
331 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
332 @@ -694,11 +699,11 @@ bus_driver_handle_release_service (DBusConnection *connection,
333 if (!dbus_message_get_args (message, error,
334 DBUS_TYPE_STRING, &name,
337 + return BUS_RESULT_FALSE;
339 _dbus_verbose ("Trying to release name %s\n", name);
342 + retval = BUS_RESULT_FALSE;
345 _dbus_string_init_const (&service_name, name);
346 @@ -727,7 +732,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
351 + retval = BUS_RESULT_TRUE;
355 @@ -735,7 +740,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
361 bus_driver_handle_service_exists (DBusConnection *connection,
362 BusTransaction *transaction,
363 DBusMessage *message,
364 @@ -746,7 +751,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
366 dbus_bool_t service_exists;
368 - dbus_bool_t retval;
370 BusRegistry *registry;
372 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
373 @@ -756,9 +761,9 @@ bus_driver_handle_service_exists (DBusConnection *connection,
374 if (!dbus_message_get_args (message, error,
375 DBUS_TYPE_STRING, &name,
378 + return BUS_RESULT_FALSE;
381 + retval = BUS_RESULT_FALSE;
383 if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
385 @@ -792,7 +797,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
390 + retval = BUS_RESULT_TRUE;
394 @@ -801,7 +806,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
400 bus_driver_handle_activate_service (DBusConnection *connection,
401 BusTransaction *transaction,
402 DBusMessage *message,
403 @@ -809,7 +814,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
407 - dbus_bool_t retval;
409 BusActivation *activation;
411 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
412 @@ -823,10 +828,10 @@ bus_driver_handle_activate_service (DBusConnection *connection,
414 _DBUS_ASSERT_ERROR_IS_SET (error);
415 _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
417 + return BUS_RESULT_FALSE;
421 + retval = BUS_RESULT_FALSE;
423 if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
424 message, name, error))
425 @@ -836,7 +841,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
430 + retval = BUS_RESULT_TRUE;
434 @@ -872,13 +877,13 @@ send_ack_reply (DBusConnection *connection,
440 bus_driver_handle_update_activation_environment (DBusConnection *connection,
441 BusTransaction *transaction,
442 DBusMessage *message,
445 - dbus_bool_t retval;
447 BusActivation *activation;
448 DBusMessageIter iter;
449 DBusMessageIter dict_iter;
450 @@ -939,7 +944,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
452 dbus_message_iter_recurse (&iter, &dict_iter);
455 + retval = BUS_RESULT_FALSE;
457 /* Then loop through the sent dictionary, add the location of
458 * the environment keys and values to lists. The result will
459 @@ -1026,7 +1031,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
464 + retval = BUS_RESULT_TRUE;
467 _dbus_list_clear (&keys);
468 @@ -1034,7 +1039,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
474 bus_driver_handle_add_match (DBusConnection *connection,
475 BusTransaction *transaction,
476 DBusMessage *message,
477 @@ -1093,16 +1098,16 @@ bus_driver_handle_add_match (DBusConnection *connection,
479 bus_match_rule_unref (rule);
482 + return BUS_RESULT_TRUE;
485 _DBUS_ASSERT_ERROR_IS_SET (error);
487 bus_match_rule_unref (rule);
489 + return BUS_RESULT_FALSE;
494 bus_driver_handle_remove_match (DBusConnection *connection,
495 BusTransaction *transaction,
496 DBusMessage *message,
497 @@ -1146,16 +1151,16 @@ bus_driver_handle_remove_match (DBusConnection *connection,
499 bus_match_rule_unref (rule);
502 + return BUS_RESULT_TRUE;
505 _DBUS_ASSERT_ERROR_IS_SET (error);
507 bus_match_rule_unref (rule);
509 + return BUS_RESULT_FALSE;
514 bus_driver_handle_get_service_owner (DBusConnection *connection,
515 BusTransaction *transaction,
516 DBusMessage *message,
517 @@ -1225,7 +1230,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
519 dbus_message_unref (reply);
522 + return BUS_RESULT_TRUE;
526 @@ -1234,10 +1239,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
527 _DBUS_ASSERT_ERROR_IS_SET (error);
529 dbus_message_unref (reply);
531 + return BUS_RESULT_FALSE;
536 bus_driver_handle_list_queued_owners (DBusConnection *connection,
537 BusTransaction *transaction,
538 DBusMessage *message,
539 @@ -1328,7 +1333,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
541 dbus_message_unref (reply);
544 + return BUS_RESULT_TRUE;
548 @@ -1341,10 +1346,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
550 _dbus_list_clear (&base_names);
553 + return BUS_RESULT_FALSE;
558 bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
559 BusTransaction *transaction,
560 DBusMessage *message,
561 @@ -1389,7 +1394,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
563 dbus_message_unref (reply);
566 + return BUS_RESULT_TRUE;
570 @@ -1398,10 +1403,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
571 _DBUS_ASSERT_ERROR_IS_SET (error);
573 dbus_message_unref (reply);
575 + return BUS_RESULT_FALSE;
580 bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
581 BusTransaction *transaction,
582 DBusMessage *message,
583 @@ -1446,7 +1451,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
585 dbus_message_unref (reply);
588 + return BUS_RESULT_TRUE;
592 @@ -1455,10 +1460,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
593 _DBUS_ASSERT_ERROR_IS_SET (error);
595 dbus_message_unref (reply);
597 + return BUS_RESULT_FALSE;
602 bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
603 BusTransaction *transaction,
604 DBusMessage *message,
605 @@ -1502,7 +1507,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
607 dbus_message_unref (reply);
610 + return BUS_RESULT_TRUE;
614 @@ -1511,10 +1516,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
615 _DBUS_ASSERT_ERROR_IS_SET (error);
617 dbus_message_unref (reply);
619 + return BUS_RESULT_FALSE;
624 bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
625 BusTransaction *transaction,
626 DBusMessage *message,
627 @@ -1556,7 +1561,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
629 dbus_message_unref (reply);
632 + return BUS_RESULT_TRUE;
636 @@ -1565,10 +1570,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
637 _DBUS_ASSERT_ERROR_IS_SET (error);
639 dbus_message_unref (reply);
641 + return BUS_RESULT_FALSE;
646 bus_driver_handle_get_connection_credentials (DBusConnection *connection,
647 BusTransaction *transaction,
648 DBusMessage *message,
649 @@ -1645,7 +1650,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
651 dbus_message_unref (reply);
654 + return BUS_RESULT_TRUE;
658 @@ -1659,10 +1664,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
659 dbus_message_unref (reply);
663 + return BUS_RESULT_FALSE;
668 bus_driver_handle_reload_config (DBusConnection *connection,
669 BusTransaction *transaction,
670 DBusMessage *message,
671 @@ -1687,7 +1692,7 @@ bus_driver_handle_reload_config (DBusConnection *connection,
674 dbus_message_unref (reply);
676 + return BUS_RESULT_TRUE;
680 @@ -1696,10 +1701,10 @@ bus_driver_handle_reload_config (DBusConnection *connection,
681 _DBUS_ASSERT_ERROR_IS_SET (error);
683 dbus_message_unref (reply);
685 + return BUS_RESULT_FALSE;
690 bus_driver_handle_get_id (DBusConnection *connection,
691 BusTransaction *transaction,
692 DBusMessage *message,
693 @@ -1715,7 +1720,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
694 if (!_dbus_string_init (&uuid))
698 + return BUS_RESULT_FALSE;
702 @@ -1741,7 +1746,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
704 _dbus_string_free (&uuid);
705 dbus_message_unref (reply);
707 + return BUS_RESULT_TRUE;
710 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
711 @@ -1751,7 +1756,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
713 dbus_message_unref (reply);
714 _dbus_string_free (&uuid);
716 + return BUS_RESULT_FALSE;
720 @@ -1759,10 +1764,10 @@ typedef struct
723 const char *out_args;
724 - dbus_bool_t (* handler) (DBusConnection *connection,
725 - BusTransaction *transaction,
726 - DBusMessage *message,
728 + BusResult (* handler) (DBusConnection *connection,
729 + BusTransaction *transaction,
730 + DBusMessage *message,
734 /* For speed it might be useful to sort this in order of
735 @@ -1847,7 +1852,7 @@ static const MessageHandler dbus_message_handlers[] = {
736 { NULL, NULL, NULL, NULL }
739 -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
740 +static BusResult bus_driver_handle_introspect (DBusConnection *,
741 BusTransaction *, DBusMessage *, DBusError *);
743 static const MessageHandler introspectable_message_handlers[] = {
744 @@ -1973,7 +1978,7 @@ bus_driver_generate_introspect_string (DBusString *xml)
750 bus_driver_handle_introspect (DBusConnection *connection,
751 BusTransaction *transaction,
752 DBusMessage *message,
753 @@ -1993,13 +1998,13 @@ bus_driver_handle_introspect (DBusConnection *connection,
756 _DBUS_ASSERT_ERROR_IS_SET (error);
758 + return BUS_RESULT_FALSE;
761 if (!_dbus_string_init (&xml))
765 + return BUS_RESULT_FALSE;
768 if (!bus_driver_generate_introspect_string (&xml))
769 @@ -2022,7 +2027,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
770 dbus_message_unref (reply);
771 _dbus_string_free (&xml);
774 + return BUS_RESULT_TRUE;
778 @@ -2032,7 +2037,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
780 _dbus_string_free (&xml);
783 + return BUS_RESULT_FALSE;
787 @@ -2067,7 +2072,7 @@ bus_driver_check_message_is_for_us (DBusMessage *message,
793 bus_driver_handle_message (DBusConnection *connection,
794 BusTransaction *transaction,
795 DBusMessage *message,
796 @@ -2077,6 +2082,7 @@ bus_driver_handle_message (DBusConnection *connection,
797 const InterfaceHandler *ih;
798 const MessageHandler *mh;
799 dbus_bool_t found_interface = FALSE;
802 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
804 @@ -2085,13 +2091,13 @@ bus_driver_handle_message (DBusConnection *connection,
807 context = bus_connection_get_context (connection);
808 - return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
809 + return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
812 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
814 _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
815 - return TRUE; /* we just ignore this */
816 + return BUS_RESULT_TRUE; /* we just ignore this */
819 /* may be NULL, which means "any interface will do" */
820 @@ -2133,20 +2139,27 @@ bus_driver_handle_message (DBusConnection *connection,
821 name, dbus_message_get_signature (message),
823 _DBUS_ASSERT_ERROR_IS_SET (error);
825 + return BUS_RESULT_FALSE;
828 - if ((* mh->handler) (connection, transaction, message, error))
829 + res = (* mh->handler) (connection, transaction, message, error);
830 + if (res == BUS_RESULT_TRUE)
832 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
833 _dbus_verbose ("Driver handler succeeded\n");
835 + return BUS_RESULT_TRUE;
838 + else if (res == BUS_RESULT_FALSE)
840 _DBUS_ASSERT_ERROR_IS_SET (error);
841 _dbus_verbose ("Driver handler returned failure\n");
843 + return BUS_RESULT_FALSE;
845 + else if (res == BUS_RESULT_LATER)
847 + _DBUS_ASSERT_ERROR_IS_CLEAR (error);
848 + _dbus_verbose ("Driver handler delayed message processing due to policy check\n");
849 + return BUS_RESULT_LATER;
853 @@ -2158,7 +2171,7 @@ bus_driver_handle_message (DBusConnection *connection,
854 "%s does not understand message %s",
855 DBUS_SERVICE_DBUS, name);
858 + return BUS_RESULT_FALSE;
862 diff --git a/bus/driver.h b/bus/driver.h
863 index 201709c..3ff4ff1 100644
867 #include "connection.h"
869 void bus_driver_remove_connection (DBusConnection *connection);
870 -dbus_bool_t bus_driver_handle_message (DBusConnection *connection,
871 +BusResult bus_driver_handle_message (DBusConnection *connection,
872 BusTransaction *transaction,
873 DBusMessage *message,
875 diff --git a/bus/policy.c b/bus/policy.c
876 index 448147f..3672ff9 100644
879 @@ -1323,18 +1323,21 @@ bus_client_policy_check_can_receive (BusClientPolicy *policy,
885 bus_rules_check_can_own (DBusList *rules,
886 - const DBusString *service_name)
887 + const DBusString *service_name,
888 + DBusConnection *connection,
889 + DBusMessage *message)
892 - dbus_bool_t allowed;
894 + const char *privilege;
896 /* rules is in the order the rules appeared
897 * in the config file, i.e. last rule that applies wins
901 + result = BUS_RESULT_FALSE;
902 link = _dbus_list_get_first_link (&rules);
905 @@ -1370,17 +1373,45 @@ bus_rules_check_can_own (DBusList *rules,
909 - allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW;
910 + switch (rule->access)
912 + case BUS_POLICY_RULE_ACCESS_ALLOW:
913 + result = BUS_RESULT_TRUE;
915 + case BUS_POLICY_RULE_ACCESS_DENY:
916 + result = BUS_RESULT_FALSE;
918 + case BUS_POLICY_RULE_ACCESS_CHECK:
919 + result = BUS_RESULT_LATER;
920 + privilege = rule->privilege;
926 + if (result == BUS_RESULT_LATER)
928 + BusContext *context = bus_connection_get_context(connection);
929 + BusCheck *check = bus_context_get_check(context);
930 + BusDeferredMessage *deferred_message;
932 + result = bus_check_privilege(check, message, connection, NULL, NULL,
933 + privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message);
934 + if (result == BUS_RESULT_LATER)
936 + bus_deferred_message_disable_sender(deferred_message);
945 bus_client_policy_check_can_own (BusClientPolicy *policy,
946 - const DBusString *service_name)
947 + const DBusString *service_name,
948 + DBusConnection *connection,
949 + DBusMessage *message)
951 - return bus_rules_check_can_own (policy->rules, service_name);
952 + return bus_rules_check_can_own (policy->rules, service_name, connection, message);
955 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
956 @@ -1388,7 +1419,7 @@ dbus_bool_t
957 bus_policy_check_can_own (BusPolicy *policy,
958 const DBusString *service_name)
960 - return bus_rules_check_can_own (policy->default_rules, service_name);
961 + return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL);
963 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
965 diff --git a/bus/policy.h b/bus/policy.h
966 index e9f193a..1f23431 100644
969 @@ -170,8 +170,10 @@ BusResult bus_client_policy_check_can_receive (BusClientPolicy *polic
970 dbus_int32_t *toggles,
971 const char **privilege_param,
972 BusDeferredMessage **deferred_message);
973 -dbus_bool_t bus_client_policy_check_can_own (BusClientPolicy *policy,
974 - const DBusString *service_name);
975 +BusResult bus_client_policy_check_can_own (BusClientPolicy *policy,
976 + const DBusString *service_name,
977 + DBusConnection *connection,
978 + DBusMessage *message);
979 dbus_bool_t bus_client_policy_append_rule (BusClientPolicy *policy,
980 BusPolicyRule *rule);
981 void bus_client_policy_optimize (BusClientPolicy *policy);
982 diff --git a/bus/services.c b/bus/services.c
983 index 584485b..f25fdf3 100644
986 @@ -374,24 +374,26 @@ bus_registry_list_services (BusRegistry *registry,
992 bus_registry_acquire_service (BusRegistry *registry,
993 DBusConnection *connection,
994 + DBusMessage *message,
995 const DBusString *service_name,
997 dbus_uint32_t *result,
998 BusTransaction *transaction,
1001 - dbus_bool_t retval;
1003 DBusConnection *old_owner_conn;
1004 BusClientPolicy *policy;
1005 BusService *service;
1006 BusActivation *activation;
1008 BusOwner *primary_owner;
1012 + retval = BUS_RESULT_FALSE;
1014 if (!_dbus_validate_bus_name (service_name, 0,
1015 _dbus_string_get_length (service_name)))
1016 @@ -459,7 +461,8 @@ bus_registry_acquire_service (BusRegistry *registry,
1020 - if (!bus_client_policy_check_can_own (policy, service_name))
1021 + res = bus_client_policy_check_can_own (policy, service_name, connection, message);
1022 + if (res == BUS_RESULT_FALSE)
1024 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1025 "Connection \"%s\" is not allowed to own the service \"%s\" due "
1026 @@ -470,6 +473,11 @@ bus_registry_acquire_service (BusRegistry *registry,
1027 _dbus_string_get_const_data (service_name));
1030 + else if (res == BUS_RESULT_LATER)
1032 + retval = BUS_RESULT_LATER;
1036 if (bus_connection_get_n_services_owned (connection) >=
1037 bus_context_get_max_services_per_connection (registry->context))
1038 @@ -586,11 +594,13 @@ bus_registry_acquire_service (BusRegistry *registry,
1041 activation = bus_context_get_activation (registry->context);
1042 - retval = bus_activation_send_pending_auto_activation_messages (activation,
1044 + if (bus_activation_send_pending_auto_activation_messages (activation,
1048 - BUS_SET_OOM (error);
1050 + retval = BUS_RESULT_TRUE;
1052 + BUS_SET_OOM (error);
1056 diff --git a/bus/services.h b/bus/services.h
1057 index 056dd9f..3df3dd7 100644
1058 --- a/bus/services.h
1059 +++ b/bus/services.h
1060 @@ -50,8 +50,9 @@ void bus_registry_foreach (BusRegistry *registry
1061 dbus_bool_t bus_registry_list_services (BusRegistry *registry,
1064 -dbus_bool_t bus_registry_acquire_service (BusRegistry *registry,
1065 +BusResult bus_registry_acquire_service (BusRegistry *registry,
1066 DBusConnection *connection,
1067 + DBusMessage *message,
1068 const DBusString *service_name,
1069 dbus_uint32_t flags,
1070 dbus_uint32_t *result,
1071 diff --git a/bus/stats.c b/bus/stats.c
1072 index 20321e5..61dc428 100644
1077 #ifdef DBUS_ENABLE_STATS
1081 bus_stats_handle_get_stats (DBusConnection *connection,
1082 BusTransaction *transaction,
1083 DBusMessage *message,
1084 @@ -106,17 +106,17 @@ bus_stats_handle_get_stats (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_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1103 BusTransaction *transaction,
1104 DBusMessage *message,
1105 @@ -143,7 +143,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1106 if (! dbus_message_get_args (message, error,
1107 DBUS_TYPE_STRING, &bus_name,
1110 + return BUS_RESULT_FALSE;
1112 _dbus_string_init_const (&bus_name_str, bus_name);
1113 service = bus_registry_lookup (registry, &bus_name_str);
1114 @@ -152,7 +152,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1116 dbus_set_error (error, DBUS_ERROR_NAME_HAS_NO_OWNER,
1117 "Bus name '%s' has no owner", bus_name);
1119 + return BUS_RESULT_FALSE;
1122 stats_connection = bus_service_get_primary_owners_connection (service);
1123 @@ -214,14 +214,14 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1126 dbus_message_unref (reply);
1128 + return BUS_RESULT_TRUE;
1132 dbus_message_unref (reply);
1134 BUS_SET_OOM (error);
1136 + return BUS_RESULT_FALSE;