1 From 5bf7f759a738a451ea70732731d9a1b3e064353b 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/5] 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 Change-Id: I4c2cbd4585e41fccd8a30f825a8f0d342ab56755
20 Cherry-picked from 35ef89cd6777ea2430077fc621d21bd01df92349 by Jose.bollo
22 Updated for dbus 1.12.10 by Scott Murray.
24 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
25 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
27 diff --git a/bus/dispatch.c b/bus/dispatch.c
28 index 1bdcbf0..625add5 100644
31 @@ -516,8 +516,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 d89a658..5ee60cb 100644
54 @@ -420,7 +420,7 @@ create_unique_client_name (BusRegistry *registry,
60 bus_driver_handle_hello (DBusConnection *connection,
61 BusTransaction *transaction,
63 @@ -428,7 +428,7 @@ bus_driver_handle_hello (DBusConnection *connection,
65 DBusString unique_name;
69 BusRegistry *registry;
70 BusConnections *connections;
72 @@ -442,7 +442,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 @@ -464,16 +464,16 @@ bus_driver_handle_hello (DBusConnection *connection,
82 bus_context_log (context, DBUS_SYSTEM_LOG_WARNING, "%s (%s=%d)",
83 tmp_error.message, limit_name, limit);
84 dbus_move_error (&tmp_error, 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 @@ -506,7 +506,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 @@ -558,7 +558,7 @@ bus_driver_send_welcome_message (DBusConnection *connection,
116 bus_driver_handle_list_services (DBusConnection *connection,
117 BusTransaction *transaction,
118 DBusMessage *message,
119 @@ -580,14 +580,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 @@ -599,7 +599,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 @@ -611,7 +611,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 @@ -624,7 +624,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 @@ -635,23 +635,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 @@ -673,14 +673,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 @@ -692,7 +692,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 @@ -704,7 +704,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 @@ -717,7 +717,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 @@ -728,23 +728,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 @@ -755,7 +755,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 @@ -766,20 +767,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 @@ -800,7 +805,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
310 + retval = BUS_RESULT_TRUE;
314 @@ -808,7 +813,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
320 bus_driver_handle_release_service (DBusConnection *connection,
321 BusTransaction *transaction,
322 DBusMessage *message,
323 @@ -818,7 +823,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 @@ -828,11 +833,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 @@ -861,7 +866,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
351 + retval = BUS_RESULT_TRUE;
355 @@ -869,7 +874,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
361 bus_driver_handle_service_exists (DBusConnection *connection,
362 BusTransaction *transaction,
363 DBusMessage *message,
364 @@ -880,7 +885,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 @@ -890,9 +895,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 @@ -926,7 +931,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
390 + retval = BUS_RESULT_TRUE;
394 @@ -935,7 +940,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
400 bus_driver_handle_activate_service (DBusConnection *connection,
401 BusTransaction *transaction,
402 DBusMessage *message,
403 @@ -943,7 +948,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
407 - dbus_bool_t retval;
409 BusActivation *activation;
411 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
412 @@ -957,10 +962,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 @@ -970,7 +975,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
430 + retval = BUS_RESULT_TRUE;
434 @@ -1072,13 +1077,13 @@ bus_driver_send_or_activate (BusTransaction *transaction,
440 bus_driver_handle_update_activation_environment (DBusConnection *connection,
441 BusTransaction *transaction,
442 DBusMessage *message,
445 - dbus_bool_t retval;
447 BusActivation *activation;
449 DBusMessageIter iter;
450 @@ -1100,7 +1105,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
451 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
452 "Cannot change activation environment "
455 + return BUS_RESULT_FALSE;
458 activation = bus_connection_get_activation (connection);
459 @@ -1114,7 +1119,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
461 dbus_message_iter_recurse (&iter, &dict_iter);
464 + retval = BUS_RESULT_FALSE;
465 systemd_message = NULL;
467 /* Then loop through the sent dictionary, add the location of
468 @@ -1279,7 +1284,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
469 if (!bus_driver_send_ack_reply (connection, transaction, message, error))
473 + retval = BUS_RESULT_TRUE;
476 if (systemd_message != NULL)
477 @@ -1289,7 +1294,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
483 bus_driver_handle_add_match (DBusConnection *connection,
484 BusTransaction *transaction,
485 DBusMessage *message,
486 @@ -1371,16 +1376,16 @@ bus_driver_handle_add_match (DBusConnection *connection,
488 bus_match_rule_unref (rule);
491 + return BUS_RESULT_TRUE;
494 _DBUS_ASSERT_ERROR_IS_SET (error);
496 bus_match_rule_unref (rule);
498 + return BUS_RESULT_FALSE;
503 bus_driver_handle_remove_match (DBusConnection *connection,
504 BusTransaction *transaction,
505 DBusMessage *message,
506 @@ -1423,16 +1428,16 @@ bus_driver_handle_remove_match (DBusConnection *connection,
508 bus_match_rule_unref (rule);
511 + return BUS_RESULT_TRUE;
514 _DBUS_ASSERT_ERROR_IS_SET (error);
516 bus_match_rule_unref (rule);
518 + return BUS_RESULT_FALSE;
523 bus_driver_handle_get_service_owner (DBusConnection *connection,
524 BusTransaction *transaction,
525 DBusMessage *message,
526 @@ -1502,7 +1507,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
528 dbus_message_unref (reply);
531 + return BUS_RESULT_TRUE;
535 @@ -1511,10 +1516,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
536 _DBUS_ASSERT_ERROR_IS_SET (error);
538 dbus_message_unref (reply);
540 + return BUS_RESULT_FALSE;
545 bus_driver_handle_list_queued_owners (DBusConnection *connection,
546 BusTransaction *transaction,
547 DBusMessage *message,
548 @@ -1606,7 +1611,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
550 dbus_message_unref (reply);
553 + return BUS_RESULT_TRUE;
557 @@ -1619,10 +1624,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
559 _dbus_list_clear (&base_names);
562 + return BUS_RESULT_FALSE;
567 bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
568 BusTransaction *transaction,
569 DBusMessage *message,
570 @@ -1679,7 +1684,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
572 dbus_message_unref (reply);
575 + return BUS_RESULT_TRUE;
579 @@ -1688,10 +1693,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
580 _DBUS_ASSERT_ERROR_IS_SET (error);
582 dbus_message_unref (reply);
584 + return BUS_RESULT_FALSE;
589 bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
590 BusTransaction *transaction,
591 DBusMessage *message,
592 @@ -1748,7 +1753,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
594 dbus_message_unref (reply);
597 + return BUS_RESULT_TRUE;
601 @@ -1757,10 +1762,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
602 _DBUS_ASSERT_ERROR_IS_SET (error);
604 dbus_message_unref (reply);
606 + return BUS_RESULT_FALSE;
611 bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
612 BusTransaction *transaction,
613 DBusMessage *message,
614 @@ -1811,7 +1816,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
616 dbus_message_unref (reply);
619 + return BUS_RESULT_TRUE;
623 @@ -1820,10 +1825,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
624 _DBUS_ASSERT_ERROR_IS_SET (error);
626 dbus_message_unref (reply);
628 + return BUS_RESULT_FALSE;
633 bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
634 BusTransaction *transaction,
635 DBusMessage *message,
636 @@ -1872,7 +1877,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
638 dbus_message_unref (reply);
641 + return BUS_RESULT_TRUE;
645 @@ -1881,10 +1886,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
646 _DBUS_ASSERT_ERROR_IS_SET (error);
648 dbus_message_unref (reply);
650 + return BUS_RESULT_FALSE;
655 bus_driver_handle_get_connection_credentials (DBusConnection *connection,
656 BusTransaction *transaction,
657 DBusMessage *message,
658 @@ -1998,7 +2003,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
660 dbus_message_unref (reply);
663 + return BUS_RESULT_TRUE;
667 @@ -2012,10 +2017,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
668 dbus_message_unref (reply);
672 + return BUS_RESULT_FALSE;
677 bus_driver_handle_reload_config (DBusConnection *connection,
678 BusTransaction *transaction,
679 DBusMessage *message,
680 @@ -2040,7 +2045,7 @@ bus_driver_handle_reload_config (DBusConnection *connection,
683 dbus_message_unref (reply);
685 + return BUS_RESULT_TRUE;
689 @@ -2049,11 +2054,11 @@ bus_driver_handle_reload_config (DBusConnection *connection,
690 _DBUS_ASSERT_ERROR_IS_SET (error);
692 dbus_message_unref (reply);
694 + return BUS_RESULT_FALSE;
697 #ifdef DBUS_ENABLE_VERBOSE_MODE
700 bus_driver_handle_enable_verbose (DBusConnection *connection,
701 BusTransaction *transaction,
702 DBusMessage *message,
703 @@ -2073,7 +2078,7 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
704 _dbus_set_verbose(TRUE);
706 dbus_message_unref (reply);
708 + return BUS_RESULT_TRUE;
711 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
712 @@ -2082,10 +2087,10 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
715 dbus_message_unref (reply);
717 + return BUS_RESULT_FALSE;
722 bus_driver_handle_disable_verbose (DBusConnection *connection,
723 BusTransaction *transaction,
724 DBusMessage *message,
725 @@ -2105,7 +2110,7 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
726 _dbus_set_verbose(FALSE);
728 dbus_message_unref (reply);
730 + return BUS_RESULT_TRUE;
733 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
734 @@ -2114,11 +2119,11 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
737 dbus_message_unref (reply);
739 + return BUS_RESULT_FALSE;
745 bus_driver_handle_get_id (DBusConnection *connection,
746 BusTransaction *transaction,
747 DBusMessage *message,
748 @@ -2134,7 +2139,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
749 if (!_dbus_string_init (&uuid))
753 + return BUS_RESULT_FALSE;
757 @@ -2160,7 +2165,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
759 _dbus_string_free (&uuid);
760 dbus_message_unref (reply);
762 + return BUS_RESULT_TRUE;
765 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
766 @@ -2170,10 +2175,10 @@ bus_driver_handle_get_id (DBusConnection *connection,
768 dbus_message_unref (reply);
769 _dbus_string_free (&uuid);
771 + return BUS_RESULT_FALSE;
776 bus_driver_handle_become_monitor (DBusConnection *connection,
777 BusTransaction *transaction,
778 DBusMessage *message,
779 @@ -2189,7 +2194,7 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
783 - dbus_bool_t ret = FALSE;
784 + BusResult ret = BUS_RESULT_FALSE;
786 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
788 @@ -2262,10 +2267,10 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
789 if (!bus_connection_be_monitor (connection, transaction, &rules, error))
793 + ret = BUS_RESULT_TRUE;
797 + if (ret == BUS_RESULT_TRUE)
798 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
800 _DBUS_ASSERT_ERROR_IS_SET (error);
801 @@ -2389,10 +2394,10 @@ typedef struct
804 const char *out_args;
805 - dbus_bool_t (* handler) (DBusConnection *connection,
806 - BusTransaction *transaction,
807 - DBusMessage *message,
809 + BusResult (* handler) (DBusConnection *connection,
810 + BusTransaction *transaction,
811 + DBusMessage *message,
816 @@ -2511,7 +2516,7 @@ static const PropertyHandler dbus_property_handlers[] = {
820 -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
821 +static BusResult bus_driver_handle_introspect (DBusConnection *,
822 BusTransaction *, DBusMessage *, DBusError *);
824 static const MessageHandler properties_message_handlers[] = {
825 @@ -2763,7 +2768,7 @@ bus_driver_generate_introspect_string (DBusString *xml,
831 bus_driver_handle_introspect (DBusConnection *connection,
832 BusTransaction *transaction,
833 DBusMessage *message,
834 @@ -2784,13 +2789,13 @@ bus_driver_handle_introspect (DBusConnection *connection,
837 _DBUS_ASSERT_ERROR_IS_SET (error);
839 + return BUS_RESULT_FALSE;
842 if (!_dbus_string_init (&xml))
846 + return BUS_RESULT_FALSE;
849 is_canonical_path = dbus_message_has_path (message, DBUS_PATH_DBUS);
850 @@ -2815,7 +2820,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
851 dbus_message_unref (reply);
852 _dbus_string_free (&xml);
855 + return BUS_RESULT_TRUE;
859 @@ -2825,10 +2830,10 @@ bus_driver_handle_introspect (DBusConnection *connection,
861 _dbus_string_free (&xml);
864 + return BUS_RESULT_FALSE;
869 bus_driver_handle_message (DBusConnection *connection,
870 BusTransaction *transaction,
871 DBusMessage *message,
872 @@ -2839,6 +2844,7 @@ bus_driver_handle_message (DBusConnection *connection,
873 const MessageHandler *mh;
874 dbus_bool_t found_interface = FALSE;
875 dbus_bool_t is_canonical_path;
878 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
880 @@ -2854,7 +2860,7 @@ bus_driver_handle_message (DBusConnection *connection,
885 + return BUS_RESULT_FALSE;
887 context = bus_connection_get_context (connection);
888 systemd = bus_driver_get_owner_of_name (connection,
889 @@ -2871,7 +2877,7 @@ bus_driver_handle_message (DBusConnection *connection,
890 attacker ? attacker : "(unauthenticated)",
891 bus_connection_get_loginfo (connection));
894 + return BUS_RESULT_TRUE;
897 if (!bus_context_get_systemd_activation (context))
898 @@ -2879,16 +2885,16 @@ bus_driver_handle_message (DBusConnection *connection,
899 bus_context_log (context, DBUS_SYSTEM_LOG_WARNING,
900 "Ignoring unexpected ActivationFailure message "
901 "while not using systemd activation");
903 + return BUS_RESULT_FALSE;
906 - return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
907 + return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
910 if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
912 _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
913 - return TRUE; /* we just ignore this */
914 + return BUS_RESULT_TRUE; /* we just ignore this */
917 /* may be NULL, which means "any interface will do" */
918 @@ -2953,20 +2959,27 @@ bus_driver_handle_message (DBusConnection *connection,
919 name, dbus_message_get_signature (message),
921 _DBUS_ASSERT_ERROR_IS_SET (error);
923 + return BUS_RESULT_FALSE;
926 - if ((* mh->handler) (connection, transaction, message, error))
927 + res = (* mh->handler) (connection, transaction, message, error);
928 + if (res == BUS_RESULT_TRUE)
930 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
931 _dbus_verbose ("Driver handler succeeded\n");
933 + return BUS_RESULT_TRUE;
936 + else if (res == BUS_RESULT_FALSE)
938 _DBUS_ASSERT_ERROR_IS_SET (error);
939 _dbus_verbose ("Driver handler returned failure\n");
941 + return BUS_RESULT_FALSE;
943 + else if (res == BUS_RESULT_LATER)
945 + _DBUS_ASSERT_ERROR_IS_CLEAR (error);
946 + _dbus_verbose ("Driver handler delayed message processing due to policy check\n");
947 + return BUS_RESULT_LATER;
951 @@ -2978,7 +2991,7 @@ bus_driver_handle_message (DBusConnection *connection,
952 "%s does not understand message %s",
953 DBUS_SERVICE_DBUS, name);
956 + return BUS_RESULT_FALSE;
960 diff --git a/bus/driver.h b/bus/driver.h
961 index ac1289d..183c28b 100644
964 @@ -35,7 +35,7 @@ typedef enum
967 void bus_driver_remove_connection (DBusConnection *connection);
968 -dbus_bool_t bus_driver_handle_message (DBusConnection *connection,
969 +BusResult bus_driver_handle_message (DBusConnection *connection,
970 BusTransaction *transaction,
971 DBusMessage *message,
973 diff --git a/bus/policy.c b/bus/policy.c
974 index b1fab0d..27b66d1 100644
977 @@ -1388,18 +1388,21 @@ bus_client_policy_check_can_receive (BusClientPolicy *policy,
983 bus_rules_check_can_own (DBusList *rules,
984 - const DBusString *service_name)
985 + const DBusString *service_name,
986 + DBusConnection *connection,
987 + DBusMessage *message)
990 - dbus_bool_t allowed;
992 + const char *privilege;
994 /* rules is in the order the rules appeared
995 * in the config file, i.e. last rule that applies wins
999 + result = BUS_RESULT_FALSE;
1000 link = _dbus_list_get_first_link (&rules);
1001 while (link != NULL)
1003 @@ -1435,17 +1438,45 @@ bus_rules_check_can_own (DBusList *rules,
1007 - allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW;
1008 + switch (rule->access)
1010 + case BUS_POLICY_RULE_ACCESS_ALLOW:
1011 + result = BUS_RESULT_TRUE;
1013 + case BUS_POLICY_RULE_ACCESS_DENY:
1014 + result = BUS_RESULT_FALSE;
1016 + case BUS_POLICY_RULE_ACCESS_CHECK:
1017 + result = BUS_RESULT_LATER;
1018 + privilege = rule->privilege;
1024 + if (result == BUS_RESULT_LATER)
1026 + BusContext *context = bus_connection_get_context(connection);
1027 + BusCheck *check = bus_context_get_check(context);
1028 + BusDeferredMessage *deferred_message;
1030 + result = bus_check_privilege(check, message, connection, NULL, NULL,
1031 + privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message);
1032 + if (result == BUS_RESULT_LATER)
1034 + bus_deferred_message_disable_sender(deferred_message);
1043 bus_client_policy_check_can_own (BusClientPolicy *policy,
1044 - const DBusString *service_name)
1045 + const DBusString *service_name,
1046 + DBusConnection *connection,
1047 + DBusMessage *message)
1049 - return bus_rules_check_can_own (policy->rules, service_name);
1050 + return bus_rules_check_can_own (policy->rules, service_name, connection, message);
1053 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
1054 @@ -1453,7 +1484,7 @@ dbus_bool_t
1055 bus_policy_check_can_own (BusPolicy *policy,
1056 const DBusString *service_name)
1058 - return bus_rules_check_can_own (policy->default_rules, service_name);
1059 + return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL) == BUS_RESULT_TRUE;
1061 #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
1063 diff --git a/bus/policy.h b/bus/policy.h
1064 index f306a3c..39d7cc5 100644
1067 @@ -182,8 +182,10 @@ BusResult bus_client_policy_check_can_receive (BusClientPolicy *polic
1068 dbus_int32_t *toggles,
1069 const char **privilege_param,
1070 BusDeferredMessage **deferred_message);
1071 -dbus_bool_t bus_client_policy_check_can_own (BusClientPolicy *policy,
1072 - const DBusString *service_name);
1073 +BusResult bus_client_policy_check_can_own (BusClientPolicy *policy,
1074 + const DBusString *service_name,
1075 + DBusConnection *connection,
1076 + DBusMessage *message);
1077 dbus_bool_t bus_client_policy_append_rule (BusClientPolicy *policy,
1078 BusPolicyRule *rule);
1079 void bus_client_policy_optimize (BusClientPolicy *policy);
1080 diff --git a/bus/services.c b/bus/services.c
1081 index 127edda..586af18 100644
1082 --- a/bus/services.c
1083 +++ b/bus/services.c
1084 @@ -376,16 +376,17 @@ bus_registry_list_services (BusRegistry *registry,
1090 bus_registry_acquire_service (BusRegistry *registry,
1091 DBusConnection *connection,
1092 + DBusMessage *message,
1093 const DBusString *service_name,
1094 dbus_uint32_t flags,
1095 dbus_uint32_t *result,
1096 BusTransaction *transaction,
1099 - dbus_bool_t retval;
1101 DBusConnection *old_owner_conn;
1102 BusClientPolicy *policy;
1103 BusService *service;
1104 @@ -393,8 +394,9 @@ bus_registry_acquire_service (BusRegistry *registry,
1106 BusOwner *primary_owner;
1111 + retval = BUS_RESULT_FALSE;
1113 if (!_dbus_validate_bus_name (service_name, 0,
1114 _dbus_string_get_length (service_name)))
1115 @@ -467,7 +469,8 @@ bus_registry_acquire_service (BusRegistry *registry,
1116 _dbus_string_get_const_data (service_name), error))
1119 - if (!bus_client_policy_check_can_own (policy, service_name))
1120 + res = bus_client_policy_check_can_own (policy, service_name, connection, message);
1121 + if (res == BUS_RESULT_FALSE)
1123 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1124 "Connection \"%s\" is not allowed to own the service \"%s\" due "
1125 @@ -478,6 +481,11 @@ bus_registry_acquire_service (BusRegistry *registry,
1126 _dbus_string_get_const_data (service_name));
1129 + else if (res == BUS_RESULT_LATER)
1131 + retval = BUS_RESULT_LATER;
1135 limit = bus_context_get_max_services_per_connection (registry->context);
1137 @@ -603,11 +611,13 @@ bus_registry_acquire_service (BusRegistry *registry,
1140 activation = bus_context_get_activation (registry->context);
1141 - retval = bus_activation_send_pending_auto_activation_messages (activation,
1143 + if (bus_activation_send_pending_auto_activation_messages (activation,
1147 - BUS_SET_OOM (error);
1149 + retval = BUS_RESULT_TRUE;
1151 + BUS_SET_OOM (error);
1155 diff --git a/bus/services.h b/bus/services.h
1156 index 056dd9f..3df3dd7 100644
1157 --- a/bus/services.h
1158 +++ b/bus/services.h
1159 @@ -50,8 +50,9 @@ void bus_registry_foreach (BusRegistry *registry
1160 dbus_bool_t bus_registry_list_services (BusRegistry *registry,
1163 -dbus_bool_t bus_registry_acquire_service (BusRegistry *registry,
1164 +BusResult bus_registry_acquire_service (BusRegistry *registry,
1165 DBusConnection *connection,
1166 + DBusMessage *message,
1167 const DBusString *service_name,
1168 dbus_uint32_t flags,
1169 dbus_uint32_t *result,
1170 diff --git a/bus/stats.c b/bus/stats.c
1171 index 1582255..4ba72d6 100644
1176 #ifdef DBUS_ENABLE_STATS
1180 bus_stats_handle_get_stats (DBusConnection *connection,
1181 BusTransaction *transaction,
1182 DBusMessage *message,
1183 @@ -104,17 +104,17 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1186 dbus_message_unref (reply);
1188 + return BUS_RESULT_TRUE;
1192 dbus_message_unref (reply);
1194 BUS_SET_OOM (error);
1196 + return BUS_RESULT_FALSE;
1201 bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1202 BusTransaction *transaction,
1203 DBusMessage *message,
1204 @@ -209,7 +209,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1207 dbus_message_unref (reply);
1209 + return BUS_RESULT_TRUE;
1212 BUS_SET_OOM (error);
1213 @@ -218,11 +218,11 @@ failed:
1215 dbus_message_unref (reply);
1218 + return BUS_RESULT_FALSE;
1224 bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1225 BusTransaction *transaction,
1226 DBusMessage *message,
1227 @@ -246,7 +246,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1228 matchmaker = bus_context_get_matchmaker (context);
1230 if (!bus_registry_list_services (registry, &services, &services_len))
1232 + return BUS_RESULT_FALSE;
1234 reply = dbus_message_new_method_return (message);
1236 @@ -325,7 +325,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1238 dbus_message_unref (reply);
1239 dbus_free_string_array (services);
1241 + return BUS_RESULT_TRUE;
1245 @@ -334,7 +334,7 @@ oom:
1246 dbus_free_string_array (services);
1248 BUS_SET_OOM (error);
1250 + return BUS_RESULT_FALSE;
1254 diff --git a/bus/stats.h b/bus/stats.h
1255 index dcb022c..683fa17 100644
1260 #define BUS_INTERFACE_STATS "org.freedesktop.DBus.Debug.Stats"
1262 -dbus_bool_t bus_stats_handle_get_stats (DBusConnection *connection,
1263 +BusResult bus_stats_handle_get_stats (DBusConnection *connection,
1264 BusTransaction *transaction,
1265 DBusMessage *message,
1268 -dbus_bool_t bus_stats_handle_get_connection_stats (DBusConnection *connection,
1269 +BusResult bus_stats_handle_get_connection_stats (DBusConnection *connection,
1270 BusTransaction *transaction,
1271 DBusMessage *message,
1274 -dbus_bool_t bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1275 +BusResult bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1276 BusTransaction *transaction,
1277 DBusMessage *message,