9953dcaac0c3ad9cec30cd13290721dc302e9027
[AGL/meta-agl.git] / meta-app-framework / recipes-core / dbus-cynagora / dbus-cynagora / 0004-Add-own-rule-result-unavailability-handling.patch
1 From 28ada62c98d74285dc22b66650b09b6c8f2c28c4 Mon Sep 17 00:00:00 2001
2 From: Jacek Bukarewicz <j.bukarewicz@samsung.com>
3 Date: Thu, 27 Nov 2014 11:26:21 +0100
4 Subject: [PATCH 4/8] Add own rule result unavailability handling
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 Own rule result unavailability is handled like send rules - dispatching
10 messages from the sender is blocked and resumed when result becomes
11 available.
12
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.
17
18 Cherry-picked from 35ef89cd6777ea2430077fc621d21bd01df92349 by Jose.bollo
19
20 Updated for dbus 1.10.20 by Scott Murray and José Bollo
21
22 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
23 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
24 ---
25  bus/dispatch.c |  11 +-
26  bus/driver.c   | 334 ++++++++++++++++++++++++++++---------------------
27  bus/driver.h   |   2 +-
28  bus/policy.c   |  52 ++++++--
29  bus/policy.h   |   6 +-
30  bus/services.c |  26 ++--
31  bus/services.h |   3 +-
32  bus/stats.c    |  23 ++--
33  bus/stats.h    |   6 +-
34  9 files changed, 283 insertions(+), 180 deletions(-)
35
36 diff --git a/bus/dispatch.c b/bus/dispatch.c
37 index 7d30ce4..4b84c21 100644
38 --- a/bus/dispatch.c
39 +++ b/bus/dispatch.c
40 @@ -517,8 +517,17 @@ bus_dispatch (DBusConnection *connection,
41          }
42  
43        _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
44 -      if (!bus_driver_handle_message (connection, transaction, message, &error))
45 +      res = bus_driver_handle_message (connection, transaction, message, &error);
46 +      if (res == BUS_RESULT_FALSE)
47          goto out;
48 +      else if (res == BUS_RESULT_LATER)
49 +        {
50 +          /* connection has been disabled in message handler */
51 +          bus_transaction_cancel_and_free (transaction);
52 +          transaction = NULL;
53 +          result = DBUS_HANDLER_RESULT_LATER;
54 +          goto out;
55 +        }
56      }
57    else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
58      {
59 diff --git a/bus/driver.c b/bus/driver.c
60 index d89a658..aaeb3b2 100644
61 --- a/bus/driver.c
62 +++ b/bus/driver.c
63 @@ -420,7 +420,7 @@ create_unique_client_name (BusRegistry *registry,
64    return TRUE;
65  }
66  
67 -static dbus_bool_t
68 +static BusResult
69  bus_driver_handle_hello (DBusConnection *connection,
70                           BusTransaction *transaction,
71                           DBusMessage    *message,
72 @@ -428,7 +428,7 @@ bus_driver_handle_hello (DBusConnection *connection,
73  {
74    DBusString unique_name;
75    BusService *service;
76 -  dbus_bool_t retval;
77 +  BusResult retval;
78    BusRegistry *registry;
79    BusConnections *connections;
80    DBusError tmp_error;
81 @@ -442,7 +442,7 @@ bus_driver_handle_hello (DBusConnection *connection,
82        /* We already handled an Hello message for this connection. */
83        dbus_set_error (error, DBUS_ERROR_FAILED,
84                        "Already handled an Hello message");
85 -      return FALSE;
86 +      return BUS_RESULT_FALSE;
87      }
88  
89    /* Note that when these limits are exceeded we don't disconnect the
90 @@ -464,16 +464,16 @@ bus_driver_handle_hello (DBusConnection *connection,
91        bus_context_log (context, DBUS_SYSTEM_LOG_WARNING, "%s (%s=%d)",
92            tmp_error.message, limit_name, limit);
93        dbus_move_error (&tmp_error, error);
94 -      return FALSE;
95 +      return BUS_RESULT_FALSE;
96      }
97  
98    if (!_dbus_string_init (&unique_name))
99      {
100        BUS_SET_OOM (error);
101 -      return FALSE;
102 +      return BUS_RESULT_FALSE;
103      }
104  
105 -  retval = FALSE;
106 +  retval = BUS_RESULT_FALSE;
107  
108    registry = bus_connection_get_registry (connection);
109  
110 @@ -506,7 +506,7 @@ bus_driver_handle_hello (DBusConnection *connection,
111      goto out_0;
112  
113    _dbus_assert (bus_connection_is_active (connection));
114 -  retval = TRUE;
115 +  retval = BUS_RESULT_TRUE;
116  
117   out_0:
118    _dbus_string_free (&unique_name);
119 @@ -558,7 +558,7 @@ bus_driver_send_welcome_message (DBusConnection *connection,
120      }
121  }
122  
123 -static dbus_bool_t
124 +static BusResult
125  bus_driver_handle_list_services (DBusConnection *connection,
126                                   BusTransaction *transaction,
127                                   DBusMessage    *message,
128 @@ -580,14 +580,14 @@ bus_driver_handle_list_services (DBusConnection *connection,
129    if (reply == NULL)
130      {
131        BUS_SET_OOM (error);
132 -      return FALSE;
133 +      return BUS_RESULT_FALSE;
134      }
135  
136    if (!bus_registry_list_services (registry, &services, &len))
137      {
138        dbus_message_unref (reply);
139        BUS_SET_OOM (error);
140 -      return FALSE;
141 +      return BUS_RESULT_FALSE;
142      }
143  
144    dbus_message_iter_init_append (reply, &iter);
145 @@ -599,7 +599,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
146        dbus_free_string_array (services);
147        dbus_message_unref (reply);
148        BUS_SET_OOM (error);
149 -      return FALSE;
150 +      return BUS_RESULT_FALSE;
151      }
152  
153    {
154 @@ -611,7 +611,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
155          dbus_free_string_array (services);
156          dbus_message_unref (reply);
157          BUS_SET_OOM (error);
158 -        return FALSE;
159 +        return BUS_RESULT_FALSE;
160        }
161    }
162  
163 @@ -624,7 +624,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
164            dbus_free_string_array (services);
165            dbus_message_unref (reply);
166            BUS_SET_OOM (error);
167 -          return FALSE;
168 +          return BUS_RESULT_FALSE;
169          }
170        ++i;
171      }
172 @@ -635,23 +635,23 @@ bus_driver_handle_list_services (DBusConnection *connection,
173      {
174        dbus_message_unref (reply);
175        BUS_SET_OOM (error);
176 -      return FALSE;
177 +      return BUS_RESULT_FALSE;
178      }
179  
180    if (!bus_transaction_send_from_driver (transaction, connection, reply))
181      {
182        dbus_message_unref (reply);
183        BUS_SET_OOM (error);
184 -      return FALSE;
185 +      return BUS_RESULT_FALSE;
186      }
187    else
188      {
189        dbus_message_unref (reply);
190 -      return TRUE;
191 +      return BUS_RESULT_TRUE;
192      }
193  }
194  
195 -static dbus_bool_t
196 +static BusResult
197  bus_driver_handle_list_activatable_services (DBusConnection *connection,
198                                              BusTransaction *transaction,
199                                              DBusMessage    *message,
200 @@ -673,14 +673,14 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
201    if (reply == NULL)
202      {
203        BUS_SET_OOM (error);
204 -      return FALSE;
205 +      return BUS_RESULT_FALSE;
206      }
207  
208    if (!bus_activation_list_services (activation, &services, &len))
209      {
210        dbus_message_unref (reply);
211        BUS_SET_OOM (error);
212 -      return FALSE;
213 +      return BUS_RESULT_FALSE;
214      }
215  
216    dbus_message_iter_init_append (reply, &iter);
217 @@ -692,7 +692,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
218        dbus_free_string_array (services);
219        dbus_message_unref (reply);
220        BUS_SET_OOM (error);
221 -      return FALSE;
222 +      return BUS_RESULT_FALSE;
223      }
224  
225    {
226 @@ -704,7 +704,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
227         dbus_free_string_array (services);
228         dbus_message_unref (reply);
229         BUS_SET_OOM (error);
230 -       return FALSE;
231 +       return BUS_RESULT_FALSE;
232        }
233    }
234  
235 @@ -717,7 +717,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
236           dbus_free_string_array (services);
237           dbus_message_unref (reply);
238           BUS_SET_OOM (error);
239 -         return FALSE;
240 +         return BUS_RESULT_FALSE;
241         }
242        ++i;
243      }
244 @@ -728,23 +728,23 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
245      {
246        dbus_message_unref (reply);
247        BUS_SET_OOM (error);
248 -      return FALSE;
249 +      return BUS_RESULT_FALSE;
250      }
251  
252    if (!bus_transaction_send_from_driver (transaction, connection, reply))
253      {
254        dbus_message_unref (reply);
255        BUS_SET_OOM (error);
256 -      return FALSE;
257 +      return BUS_RESULT_FALSE;
258      }
259    else
260      {
261        dbus_message_unref (reply);
262 -      return TRUE;
263 +      return BUS_RESULT_TRUE;
264      }
265  }
266  
267 -static dbus_bool_t
268 +static BusResult
269  bus_driver_handle_acquire_service (DBusConnection *connection,
270                                     BusTransaction *transaction,
271                                     DBusMessage    *message,
272 @@ -755,7 +755,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
273    const char *name;
274    dbus_uint32_t service_reply;
275    dbus_uint32_t flags;
276 -  dbus_bool_t retval;
277 +  BusResult retval;
278 +  BusResult res;
279    BusRegistry *registry;
280  
281    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
282 @@ -766,20 +767,24 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
283                                DBUS_TYPE_STRING, &name,
284                                DBUS_TYPE_UINT32, &flags,
285                                DBUS_TYPE_INVALID))
286 -    return FALSE;
287 +    return BUS_RESULT_FALSE;
288  
289    _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
290  
291 -  retval = FALSE;
292 +  retval = BUS_RESULT_FALSE;
293    reply = NULL;
294  
295    _dbus_string_init_const (&service_name, name);
296  
297 -  if (!bus_registry_acquire_service (registry, connection,
298 -                                     &service_name, flags,
299 -                                     &service_reply, transaction,
300 -                                     error))
301 -    goto out;
302 +  res = bus_registry_acquire_service (registry, connection, message,
303 +                                       &service_name, flags,
304 +                                       &service_reply, transaction,
305 +                                       error);
306 +  if (res != BUS_RESULT_TRUE)
307 +    {
308 +      retval = res;
309 +      goto out;
310 +    }
311  
312    reply = dbus_message_new_method_return (message);
313    if (reply == NULL)
314 @@ -800,7 +805,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
315        goto out;
316      }
317  
318 -  retval = TRUE;
319 +  retval = BUS_RESULT_TRUE;
320  
321   out:
322    if (reply)
323 @@ -808,7 +813,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
324    return retval;
325  }
326  
327 -static dbus_bool_t
328 +static BusResult
329  bus_driver_handle_release_service (DBusConnection *connection,
330                                     BusTransaction *transaction,
331                                     DBusMessage    *message,
332 @@ -818,7 +823,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
333    DBusString service_name;
334    const char *name;
335    dbus_uint32_t service_reply;
336 -  dbus_bool_t retval;
337 +  BusResult retval;
338    BusRegistry *registry;
339  
340    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
341 @@ -828,11 +833,11 @@ bus_driver_handle_release_service (DBusConnection *connection,
342    if (!dbus_message_get_args (message, error,
343                                DBUS_TYPE_STRING, &name,
344                                DBUS_TYPE_INVALID))
345 -    return FALSE;
346 +    return BUS_RESULT_FALSE;
347  
348    _dbus_verbose ("Trying to release name %s\n", name);
349  
350 -  retval = FALSE;
351 +  retval = BUS_RESULT_FALSE;
352    reply = NULL;
353  
354    _dbus_string_init_const (&service_name, name);
355 @@ -861,7 +866,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
356        goto out;
357      }
358  
359 -  retval = TRUE;
360 +  retval = BUS_RESULT_TRUE;
361  
362   out:
363    if (reply)
364 @@ -869,7 +874,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
365    return retval;
366  }
367  
368 -static dbus_bool_t
369 +static BusResult
370  bus_driver_handle_service_exists (DBusConnection *connection,
371                                    BusTransaction *transaction,
372                                    DBusMessage    *message,
373 @@ -880,7 +885,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
374    BusService *service;
375    dbus_bool_t service_exists;
376    const char *name;
377 -  dbus_bool_t retval;
378 +  BusResult retval;
379    BusRegistry *registry;
380  
381    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
382 @@ -890,9 +895,9 @@ bus_driver_handle_service_exists (DBusConnection *connection,
383    if (!dbus_message_get_args (message, error,
384                                DBUS_TYPE_STRING, &name,
385                                DBUS_TYPE_INVALID))
386 -    return FALSE;
387 +    return BUS_RESULT_FALSE;
388  
389 -  retval = FALSE;
390 +  retval = BUS_RESULT_FALSE;
391  
392    if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
393      {
394 @@ -926,7 +931,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
395        goto out;
396      }
397  
398 -  retval = TRUE;
399 +  retval = BUS_RESULT_TRUE;
400  
401   out:
402    if (reply)
403 @@ -935,7 +940,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
404    return retval;
405  }
406  
407 -static dbus_bool_t
408 +static BusResult
409  bus_driver_handle_activate_service (DBusConnection *connection,
410                                      BusTransaction *transaction,
411                                      DBusMessage    *message,
412 @@ -943,7 +948,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
413  {
414    dbus_uint32_t flags;
415    const char *name;
416 -  dbus_bool_t retval;
417 +  BusResult retval;
418    BusActivation *activation;
419  
420    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
421 @@ -957,10 +962,10 @@ bus_driver_handle_activate_service (DBusConnection *connection,
422      {
423        _DBUS_ASSERT_ERROR_IS_SET (error);
424        _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
425 -      return FALSE;
426 +      return BUS_RESULT_FALSE;
427      }
428  
429 -  retval = FALSE;
430 +  retval = BUS_RESULT_FALSE;
431  
432    if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
433                                          message, name, error))
434 @@ -970,7 +975,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
435        goto out;
436      }
437  
438 -  retval = TRUE;
439 +  retval = BUS_RESULT_TRUE;
440  
441   out:
442    return retval;
443 @@ -1072,13 +1077,13 @@ bus_driver_send_or_activate (BusTransaction *transaction,
444    return TRUE;
445  }
446  
447 -static dbus_bool_t
448 +static BusResult
449  bus_driver_handle_update_activation_environment (DBusConnection *connection,
450                                                   BusTransaction *transaction,
451                                                   DBusMessage    *message,
452                                                   DBusError      *error)
453  {
454 -  dbus_bool_t retval;
455 +  BusResult retval;
456    BusActivation *activation;
457    BusContext *context;
458    DBusMessageIter iter;
459 @@ -1100,7 +1105,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
460        dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
461                        "Cannot change activation environment "
462                        "on a system bus.");
463 -      return FALSE;
464 +      return BUS_RESULT_FALSE;
465      }
466  
467    activation = bus_connection_get_activation (connection);
468 @@ -1114,7 +1119,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
469  
470    dbus_message_iter_recurse (&iter, &dict_iter);
471  
472 -  retval = FALSE;
473 +  retval = BUS_RESULT_FALSE;
474    systemd_message = NULL;
475  
476    /* Then loop through the sent dictionary, add the location of
477 @@ -1279,7 +1284,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
478    if (!bus_driver_send_ack_reply (connection, transaction, message, error))
479      goto out;
480  
481 -  retval = TRUE;
482 +  retval = BUS_RESULT_TRUE;
483  
484   out:
485    if (systemd_message != NULL)
486 @@ -1289,7 +1294,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
487    return retval;
488  }
489  
490 -static dbus_bool_t
491 +static BusResult
492  bus_driver_handle_add_match (DBusConnection *connection,
493                               BusTransaction *transaction,
494                               DBusMessage    *message,
495 @@ -1371,16 +1376,16 @@ bus_driver_handle_add_match (DBusConnection *connection,
496  
497    bus_match_rule_unref (rule);
498  
499 -  return TRUE;
500 +  return BUS_RESULT_TRUE;
501  
502   failed:
503    _DBUS_ASSERT_ERROR_IS_SET (error);
504    if (rule)
505      bus_match_rule_unref (rule);
506 -  return FALSE;
507 +  return BUS_RESULT_FALSE;
508  }
509  
510 -static dbus_bool_t
511 +static BusResult
512  bus_driver_handle_remove_match (DBusConnection *connection,
513                                  BusTransaction *transaction,
514                                  DBusMessage    *message,
515 @@ -1423,16 +1428,16 @@ bus_driver_handle_remove_match (DBusConnection *connection,
516  
517    bus_match_rule_unref (rule);
518  
519 -  return TRUE;
520 +  return BUS_RESULT_TRUE;
521  
522   failed:
523    _DBUS_ASSERT_ERROR_IS_SET (error);
524    if (rule)
525      bus_match_rule_unref (rule);
526 -  return FALSE;
527 +  return BUS_RESULT_FALSE;
528  }
529  
530 -static dbus_bool_t
531 +static BusResult
532  bus_driver_handle_get_service_owner (DBusConnection *connection,
533                                      BusTransaction *transaction,
534                                      DBusMessage    *message,
535 @@ -1502,7 +1507,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
536  
537    dbus_message_unref (reply);
538  
539 -  return TRUE;
540 +  return BUS_RESULT_TRUE;
541  
542   oom:
543    BUS_SET_OOM (error);
544 @@ -1511,10 +1516,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
545    _DBUS_ASSERT_ERROR_IS_SET (error);
546    if (reply)
547      dbus_message_unref (reply);
548 -  return FALSE;
549 +  return BUS_RESULT_FALSE;
550  }
551  
552 -static dbus_bool_t
553 +static BusResult
554  bus_driver_handle_list_queued_owners (DBusConnection *connection,
555                                       BusTransaction *transaction,
556                                       DBusMessage    *message,
557 @@ -1606,7 +1611,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
558  
559    dbus_message_unref (reply);
560  
561 -  return TRUE;
562 +  return BUS_RESULT_TRUE;
563  
564   oom:
565    BUS_SET_OOM (error);
566 @@ -1619,10 +1624,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
567    if (base_names)
568      _dbus_list_clear (&base_names);
569  
570 -  return FALSE;
571 +  return BUS_RESULT_FALSE;
572  }
573  
574 -static dbus_bool_t
575 +static BusResult
576  bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
577                                              BusTransaction *transaction,
578                                              DBusMessage    *message,
579 @@ -1679,7 +1684,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
580  
581    dbus_message_unref (reply);
582  
583 -  return TRUE;
584 +  return BUS_RESULT_TRUE;
585  
586   oom:
587    BUS_SET_OOM (error);
588 @@ -1688,10 +1693,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
589    _DBUS_ASSERT_ERROR_IS_SET (error);
590    if (reply)
591      dbus_message_unref (reply);
592 -  return FALSE;
593 +  return BUS_RESULT_FALSE;
594  }
595  
596 -static dbus_bool_t
597 +static BusResult
598  bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
599                                                   BusTransaction *transaction,
600                                                   DBusMessage    *message,
601 @@ -1748,7 +1753,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
602  
603    dbus_message_unref (reply);
604  
605 -  return TRUE;
606 +  return BUS_RESULT_TRUE;
607  
608   oom:
609    BUS_SET_OOM (error);
610 @@ -1757,10 +1762,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
611    _DBUS_ASSERT_ERROR_IS_SET (error);
612    if (reply)
613      dbus_message_unref (reply);
614 -  return FALSE;
615 +  return BUS_RESULT_FALSE;
616  }
617  
618 -static dbus_bool_t
619 +static BusResult
620  bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
621                                               BusTransaction *transaction,
622                                               DBusMessage    *message,
623 @@ -1811,7 +1816,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
624  
625    dbus_message_unref (reply);
626  
627 -  return TRUE;
628 +  return BUS_RESULT_TRUE;
629  
630   oom:
631    BUS_SET_OOM (error);
632 @@ -1820,10 +1825,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
633    _DBUS_ASSERT_ERROR_IS_SET (error);
634    if (reply)
635      dbus_message_unref (reply);
636 -  return FALSE;
637 +  return BUS_RESULT_FALSE;
638  }
639  
640 -static dbus_bool_t
641 +static BusResult
642  bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
643                                                            BusTransaction *transaction,
644                                                            DBusMessage    *message,
645 @@ -1872,7 +1877,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
646  
647    dbus_message_unref (reply);
648  
649 -  return TRUE;
650 +  return BUS_RESULT_TRUE;
651  
652   oom:
653    BUS_SET_OOM (error);
654 @@ -1881,10 +1886,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
655    _DBUS_ASSERT_ERROR_IS_SET (error);
656    if (reply)
657      dbus_message_unref (reply);
658 -  return FALSE;
659 +  return BUS_RESULT_FALSE;
660  }
661  
662 -static dbus_bool_t
663 +static BusResult
664  bus_driver_handle_get_connection_credentials (DBusConnection *connection,
665                                                BusTransaction *transaction,
666                                                DBusMessage    *message,
667 @@ -1998,7 +2003,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
668  
669    dbus_message_unref (reply);
670  
671 -  return TRUE;
672 +  return BUS_RESULT_TRUE;
673  
674   oom:
675    BUS_SET_OOM (error);
676 @@ -2012,10 +2017,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
677        dbus_message_unref (reply);
678      }
679  
680 -  return FALSE;
681 +  return BUS_RESULT_FALSE;
682  }
683  
684 -static dbus_bool_t
685 +static BusResult
686  bus_driver_handle_reload_config (DBusConnection *connection,
687                                  BusTransaction *transaction,
688                                  DBusMessage    *message,
689 @@ -2040,7 +2045,7 @@ bus_driver_handle_reload_config (DBusConnection *connection,
690      goto oom;
691  
692    dbus_message_unref (reply);
693 -  return TRUE;
694 +  return BUS_RESULT_TRUE;
695  
696   oom:
697    BUS_SET_OOM (error);
698 @@ -2049,11 +2054,11 @@ bus_driver_handle_reload_config (DBusConnection *connection,
699    _DBUS_ASSERT_ERROR_IS_SET (error);
700    if (reply)
701      dbus_message_unref (reply);
702 -  return FALSE;
703 +  return BUS_RESULT_FALSE;
704  }
705  
706  #ifdef DBUS_ENABLE_VERBOSE_MODE
707 -static dbus_bool_t
708 +static BusResult
709  bus_driver_handle_enable_verbose (DBusConnection *connection,
710                                    BusTransaction *transaction,
711                                    DBusMessage    *message,
712 @@ -2073,7 +2078,7 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
713      _dbus_set_verbose(TRUE);
714  
715      dbus_message_unref (reply);
716 -    return TRUE;
717 +    return BUS_RESULT_TRUE;
718  
719     oom:
720      _DBUS_ASSERT_ERROR_IS_CLEAR (error);
721 @@ -2082,10 +2087,10 @@ bus_driver_handle_enable_verbose (DBusConnection *connection,
722  
723      if (reply)
724        dbus_message_unref (reply);
725 -    return FALSE;
726 +    return BUS_RESULT_FALSE;
727  }
728  
729 -static dbus_bool_t
730 +static BusResult
731  bus_driver_handle_disable_verbose (DBusConnection *connection,
732                                     BusTransaction *transaction,
733                                     DBusMessage    *message,
734 @@ -2105,7 +2110,7 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
735      _dbus_set_verbose(FALSE);
736  
737      dbus_message_unref (reply);
738 -    return TRUE;
739 +    return BUS_RESULT_TRUE;
740  
741     oom:
742      _DBUS_ASSERT_ERROR_IS_CLEAR (error);
743 @@ -2114,11 +2119,11 @@ bus_driver_handle_disable_verbose (DBusConnection *connection,
744  
745      if (reply)
746        dbus_message_unref (reply);
747 -    return FALSE;
748 +    return BUS_RESULT_FALSE;
749  }
750  #endif
751  
752 -static dbus_bool_t
753 +static BusResult
754  bus_driver_handle_get_id (DBusConnection *connection,
755                            BusTransaction *transaction,
756                            DBusMessage    *message,
757 @@ -2134,7 +2139,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
758    if (!_dbus_string_init (&uuid))
759      {
760        BUS_SET_OOM (error);
761 -      return FALSE;
762 +      return BUS_RESULT_FALSE;
763      }
764  
765    reply = NULL;
766 @@ -2160,7 +2165,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
767  
768    _dbus_string_free (&uuid);
769    dbus_message_unref (reply);
770 -  return TRUE;
771 +  return BUS_RESULT_TRUE;
772  
773   oom:
774    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
775 @@ -2170,10 +2175,10 @@ bus_driver_handle_get_id (DBusConnection *connection,
776    if (reply)
777      dbus_message_unref (reply);
778    _dbus_string_free (&uuid);
779 -  return FALSE;
780 +  return BUS_RESULT_FALSE;
781  }
782  
783 -static dbus_bool_t
784 +static BusResult
785  bus_driver_handle_become_monitor (DBusConnection *connection,
786                                    BusTransaction *transaction,
787                                    DBusMessage    *message,
788 @@ -2189,7 +2194,7 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
789    int i;
790    int n_match_rules;
791    dbus_uint32_t flags;
792 -  dbus_bool_t ret = FALSE;
793 +  BusResult ret = BUS_RESULT_FALSE;
794  
795    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
796  
797 @@ -2262,10 +2267,10 @@ bus_driver_handle_become_monitor (DBusConnection *connection,
798    if (!bus_connection_be_monitor (connection, transaction, &rules, error))
799      goto out;
800  
801 -  ret = TRUE;
802 +  ret = BUS_RESULT_TRUE;
803  
804  out:
805 -  if (ret)
806 +  if (ret == BUS_RESULT_TRUE)
807      _DBUS_ASSERT_ERROR_IS_CLEAR (error);
808    else
809      _DBUS_ASSERT_ERROR_IS_SET (error);
810 @@ -2281,7 +2286,7 @@ out:
811    return ret;
812  }
813  
814 -static dbus_bool_t
815 +static BusResult
816  bus_driver_handle_get_machine_id (DBusConnection *connection,
817                                    BusTransaction *transaction,
818                                    DBusMessage *message,
819 @@ -2296,7 +2301,7 @@ bus_driver_handle_get_machine_id (DBusConnection *connection,
820    if (!_dbus_string_init (&uuid))
821      {
822        BUS_SET_OOM (error);
823 -      return FALSE;
824 +      return BUS_RESULT_FALSE;
825      }
826  
827    if (!_dbus_get_local_machine_uuid_encoded (&uuid, error))
828 @@ -2321,7 +2326,7 @@ bus_driver_handle_get_machine_id (DBusConnection *connection,
829  
830    _dbus_string_free (&uuid);
831    dbus_message_unref (reply);
832 -  return TRUE;
833 +  return BUS_RESULT_TRUE;
834  
835  oom:
836    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
837 @@ -2335,29 +2340,30 @@ fail:
838      dbus_message_unref (reply);
839  
840    _dbus_string_free (&uuid);
841 -  return FALSE;
842 +  return BUS_RESULT_FALSE;
843  }
844  
845 -static dbus_bool_t
846 +static BusResult
847  bus_driver_handle_ping (DBusConnection *connection,
848                          BusTransaction *transaction,
849                          DBusMessage *message,
850                          DBusError *error)
851  {
852 -  return bus_driver_send_ack_reply (connection, transaction, message, error);
853 +  return bus_driver_send_ack_reply (connection, transaction, message, error) == TRUE
854 +               ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
855  }
856  
857 -static dbus_bool_t bus_driver_handle_get (DBusConnection *connection,
858 +static BusResult bus_driver_handle_get (DBusConnection *connection,
859                                            BusTransaction *transaction,
860                                            DBusMessage *message,
861                                            DBusError *error);
862  
863 -static dbus_bool_t bus_driver_handle_get_all (DBusConnection *connection,
864 +static BusResult bus_driver_handle_get_all (DBusConnection *connection,
865                                                BusTransaction *transaction,
866                                                DBusMessage *message,
867                                                DBusError *error);
868  
869 -static dbus_bool_t bus_driver_handle_set (DBusConnection *connection,
870 +static BusResult bus_driver_handle_set (DBusConnection *connection,
871                                            BusTransaction *transaction,
872                                            DBusMessage *message,
873                                            DBusError *error);
874 @@ -2389,10 +2395,10 @@ typedef struct
875    const char *name;
876    const char *in_args;
877    const char *out_args;
878 -  dbus_bool_t (* handler) (DBusConnection *connection,
879 -                           BusTransaction *transaction,
880 -                           DBusMessage    *message,
881 -                           DBusError      *error);
882 +  BusResult (* handler) (DBusConnection *connection,
883 +                         BusTransaction *transaction,
884 +                         DBusMessage    *message,
885 +                         DBusError      *error);
886    MethodFlags flags;
887  } MessageHandler;
888  
889 @@ -2511,7 +2517,7 @@ static const PropertyHandler dbus_property_handlers[] = {
890    { NULL, NULL, NULL }
891  };
892  
893 -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
894 +static BusResult bus_driver_handle_introspect (DBusConnection *,
895      BusTransaction *, DBusMessage *, DBusError *);
896  
897  static const MessageHandler properties_message_handlers[] = {
898 @@ -2763,7 +2769,7 @@ bus_driver_generate_introspect_string (DBusString *xml,
899    return TRUE;
900  }
901  
902 -static dbus_bool_t
903 +static BusResult
904  bus_driver_handle_introspect (DBusConnection *connection,
905                                BusTransaction *transaction,
906                                DBusMessage    *message,
907 @@ -2784,13 +2790,13 @@ bus_driver_handle_introspect (DBusConnection *connection,
908                                DBUS_TYPE_INVALID))
909      {
910        _DBUS_ASSERT_ERROR_IS_SET (error);
911 -      return FALSE;
912 +      return BUS_RESULT_FALSE;
913      }
914  
915    if (!_dbus_string_init (&xml))
916      {
917        BUS_SET_OOM (error);
918 -      return FALSE;
919 +      return BUS_RESULT_FALSE;
920      }
921  
922    is_canonical_path = dbus_message_has_path (message, DBUS_PATH_DBUS);
923 @@ -2815,7 +2821,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
924    dbus_message_unref (reply);
925    _dbus_string_free (&xml);
926  
927 -  return TRUE;
928 +  return BUS_RESULT_TRUE;
929  
930   oom:
931    BUS_SET_OOM (error);
932 @@ -2825,10 +2831,42 @@ bus_driver_handle_introspect (DBusConnection *connection,
933  
934    _dbus_string_free (&xml);
935  
936 -  return FALSE;
937 +  return BUS_RESULT_FALSE;
938  }
939  
940 +/*
941 + * Set @error and return FALSE if the message is not directed to the
942 + * dbus-daemon by its canonical object path. This is hardening against
943 + * system services with poorly-written security policy files, which
944 + * might allow sending dangerously broad equivalence classes of messages
945 + * such as "anything with this assumed-to-be-safe object path".
946 + *
947 + * dbus-daemon is unusual in that it normally ignores the object path
948 + * of incoming messages; we need to keep that behaviour for the "read"
949 + * read-only method calls like GetConnectionUnixUser for backwards
950 + * compatibility, but it seems safer to be more restrictive for things
951 + * intended to be root-only or privileged-developers-only.
952 + *
953 + * It is possible that there are other system services with the same
954 + * quirk as dbus-daemon.
955 + */
956  dbus_bool_t
957 +bus_driver_check_message_is_for_us (DBusMessage *message,
958 +                                    DBusError   *error)
959 +{
960 +  if (!dbus_message_has_path (message, DBUS_PATH_DBUS))
961 +    {
962 +      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
963 +          "Method '%s' is only available at the canonical object path '%s'",
964 +          dbus_message_get_member (message), DBUS_PATH_DBUS);
965 +
966 +      return FALSE;
967 +    }
968 +
969 +  return TRUE;
970 +}
971 +
972 +BusResult
973  bus_driver_handle_message (DBusConnection *connection,
974                             BusTransaction *transaction,
975                            DBusMessage    *message,
976 @@ -2839,6 +2877,7 @@ bus_driver_handle_message (DBusConnection *connection,
977    const MessageHandler *mh;
978    dbus_bool_t found_interface = FALSE;
979    dbus_bool_t is_canonical_path;
980 +  BusResult res;
981  
982    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
983  
984 @@ -2854,7 +2893,7 @@ bus_driver_handle_message (DBusConnection *connection,
985                                                    transaction,
986                                                    message,
987                                                    error))
988 -        return FALSE;
989 +        return BUS_RESULT_FALSE;
990  
991        context = bus_connection_get_context (connection);
992        systemd = bus_driver_get_owner_of_name (connection,
993 @@ -2871,7 +2910,7 @@ bus_driver_handle_message (DBusConnection *connection,
994                             attacker ? attacker : "(unauthenticated)",
995                             bus_connection_get_loginfo (connection));
996            /* ignore it */
997 -          return TRUE;
998 +          return BUS_RESULT_TRUE;
999          }
1000  
1001        if (!bus_context_get_systemd_activation (context))
1002 @@ -2879,16 +2918,16 @@ bus_driver_handle_message (DBusConnection *connection,
1003            bus_context_log (context, DBUS_SYSTEM_LOG_WARNING,
1004                             "Ignoring unexpected ActivationFailure message "
1005                             "while not using systemd activation");
1006 -          return FALSE;
1007 +          return BUS_RESULT_FALSE;
1008          }
1009  
1010 -      return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
1011 +      return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
1012      }
1013  
1014    if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
1015      {
1016        _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
1017 -      return TRUE; /* we just ignore this */
1018 +      return BUS_RESULT_TRUE; /* we just ignore this */
1019      }
1020  
1021    /* may be NULL, which means "any interface will do" */
1022 @@ -2953,20 +2992,27 @@ bus_driver_handle_message (DBusConnection *connection,
1023                                name, dbus_message_get_signature (message),
1024                                mh->in_args);
1025                _DBUS_ASSERT_ERROR_IS_SET (error);
1026 -              return FALSE;
1027 +              return BUS_RESULT_FALSE;
1028              }
1029  
1030 -          if ((* mh->handler) (connection, transaction, message, error))
1031 +          res = (* mh->handler) (connection, transaction, message, error);
1032 +          if (res == BUS_RESULT_TRUE)
1033              {
1034                _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1035                _dbus_verbose ("Driver handler succeeded\n");
1036 -              return TRUE;
1037 +              return BUS_RESULT_TRUE;
1038              }
1039 -          else
1040 +          else if (res == BUS_RESULT_FALSE)
1041              {
1042                _DBUS_ASSERT_ERROR_IS_SET (error);
1043                _dbus_verbose ("Driver handler returned failure\n");
1044 -              return FALSE;
1045 +              return BUS_RESULT_FALSE;
1046 +            }
1047 +          else if (res == BUS_RESULT_LATER)
1048 +            {
1049 +              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1050 +              _dbus_verbose ("Driver handler delayed message processing due to policy check\n");
1051 +              return BUS_RESULT_LATER;
1052              }
1053          }
1054      }
1055 @@ -2978,7 +3024,7 @@ bus_driver_handle_message (DBusConnection *connection,
1056                    "%s does not understand message %s",
1057                    DBUS_SERVICE_DBUS, name);
1058  
1059 -  return FALSE;
1060 +  return BUS_RESULT_FALSE;
1061  }
1062  
1063  void
1064 @@ -3099,7 +3145,7 @@ interface_handler_find_property (const InterfaceHandler *ih,
1065    return NULL;
1066  }
1067  
1068 -static dbus_bool_t
1069 +static BusResult
1070  bus_driver_handle_get (DBusConnection *connection,
1071                         BusTransaction *transaction,
1072                         DBusMessage    *message,
1073 @@ -3120,18 +3166,18 @@ bus_driver_handle_get (DBusConnection *connection,
1074                                DBUS_TYPE_STRING, &iface,
1075                                DBUS_TYPE_STRING, &prop,
1076                                DBUS_TYPE_INVALID))
1077 -    return FALSE;
1078 +    return BUS_RESULT_FALSE;
1079  
1080    /* We only implement Properties on /org/freedesktop/DBus so far. */
1081    ih = bus_driver_find_interface (iface, TRUE, error);
1082  
1083    if (ih == NULL)
1084 -    return FALSE;
1085 +    return BUS_RESULT_FALSE;
1086  
1087    handler = interface_handler_find_property (ih, prop, error);
1088  
1089    if (handler == NULL)
1090 -    return FALSE;
1091 +    return BUS_RESULT_FALSE;
1092  
1093    context = bus_transaction_get_context (transaction);
1094  
1095 @@ -3159,17 +3205,17 @@ bus_driver_handle_get (DBusConnection *connection,
1096      goto oom;
1097  
1098    dbus_message_unref (reply);
1099 -  return TRUE;
1100 +  return BUS_RESULT_TRUE;
1101  
1102  oom:
1103    if (reply != NULL)
1104      dbus_message_unref (reply);
1105  
1106    BUS_SET_OOM (error);
1107 -  return FALSE;
1108 +  return BUS_RESULT_FALSE;
1109  }
1110  
1111 -static dbus_bool_t
1112 +static BusResult
1113  bus_driver_handle_get_all (DBusConnection *connection,
1114                             BusTransaction *transaction,
1115                             DBusMessage    *message,
1116 @@ -3188,13 +3234,13 @@ bus_driver_handle_get_all (DBusConnection *connection,
1117    if (!dbus_message_get_args (message, error,
1118                                DBUS_TYPE_STRING, &iface,
1119                                DBUS_TYPE_INVALID))
1120 -    return FALSE;
1121 +    return BUS_RESULT_FALSE;
1122  
1123    /* We only implement Properties on /org/freedesktop/DBus so far. */
1124    ih = bus_driver_find_interface (iface, TRUE, error);
1125  
1126    if (ih == NULL)
1127 -    return FALSE;
1128 +    return BUS_RESULT_FALSE;
1129  
1130    context = bus_transaction_get_context (transaction);
1131  
1132 @@ -3229,7 +3275,7 @@ bus_driver_handle_get_all (DBusConnection *connection,
1133      goto oom;
1134  
1135    dbus_message_unref (reply);
1136 -  return TRUE;
1137 +  return BUS_RESULT_TRUE;
1138  
1139  oom_abandon_message:
1140    _dbus_asv_abandon (&reply_iter, &array_iter);
1141 @@ -3239,10 +3285,10 @@ oom:
1142      dbus_message_unref (reply);
1143  
1144    BUS_SET_OOM (error);
1145 -  return FALSE;
1146 +  return BUS_RESULT_FALSE;
1147  }
1148  
1149 -static dbus_bool_t
1150 +static BusResult
1151  bus_driver_handle_set (DBusConnection *connection,
1152                         BusTransaction *transaction,
1153                         DBusMessage    *message,
1154 @@ -3271,15 +3317,15 @@ bus_driver_handle_set (DBusConnection *connection,
1155    ih = bus_driver_find_interface (iface, TRUE, error);
1156  
1157    if (ih == NULL)
1158 -    return FALSE;
1159 +    return BUS_RESULT_FALSE;
1160  
1161    handler = interface_handler_find_property (ih, prop, error);
1162  
1163    if (handler == NULL)
1164 -    return FALSE;
1165 +    return BUS_RESULT_FALSE;
1166  
1167    /* We don't implement any properties that can be set yet. */
1168    dbus_set_error (error, DBUS_ERROR_PROPERTY_READ_ONLY,
1169                    "Property '%s.%s' cannot be set", iface, prop);
1170 -  return FALSE;
1171 +  return BUS_RESULT_FALSE;
1172  }
1173 diff --git a/bus/driver.h b/bus/driver.h
1174 index a7297ad..05e9886 100644
1175 --- a/bus/driver.h
1176 +++ b/bus/driver.h
1177 @@ -35,7 +35,7 @@ typedef enum
1178  } BusDriverFound;
1179  
1180  void        bus_driver_remove_connection     (DBusConnection *connection);
1181 -dbus_bool_t bus_driver_handle_message        (DBusConnection *connection,
1182 +BusResult   bus_driver_handle_message        (DBusConnection *connection,
1183                                                BusTransaction *transaction,
1184                                                DBusMessage    *message,
1185                                                DBusError      *error);
1186 diff --git a/bus/policy.c b/bus/policy.c
1187 index 483cc97..f6f4d85 100644
1188 --- a/bus/policy.c
1189 +++ b/bus/policy.c
1190 @@ -1390,18 +1390,21 @@ bus_client_policy_check_can_receive (BusClientPolicy     *policy,
1191  
1192  
1193  
1194 -static dbus_bool_t
1195 +static BusResult
1196  bus_rules_check_can_own (DBusList *rules,
1197 -                         const DBusString *service_name)
1198 +                         const DBusString *service_name,
1199 +                         DBusConnection   *connection,
1200 +                         DBusMessage      *message)
1201  {
1202    DBusList *link;
1203 -  dbus_bool_t allowed;
1204 +  BusResult result;
1205 +  const char *privilege;
1206    
1207    /* rules is in the order the rules appeared
1208     * in the config file, i.e. last rule that applies wins
1209     */
1210  
1211 -  allowed = FALSE;
1212 +  result = BUS_RESULT_FALSE;
1213    link = _dbus_list_get_first_link (&rules);
1214    while (link != NULL)
1215      {
1216 @@ -1437,17 +1440,46 @@ bus_rules_check_can_own (DBusList *rules,
1217          }
1218  
1219        /* Use this rule */
1220 -      allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW;
1221 +      switch (rule->access)
1222 +      {
1223 +      case BUS_POLICY_RULE_ACCESS_ALLOW:
1224 +        result = BUS_RESULT_TRUE;
1225 +        break;
1226 +      default:
1227 +      case BUS_POLICY_RULE_ACCESS_DENY:
1228 +        result = BUS_RESULT_FALSE;
1229 +        break;
1230 +      case BUS_POLICY_RULE_ACCESS_CHECK:
1231 +        result = BUS_RESULT_LATER;
1232 +        privilege = rule->privilege;
1233 +        break;
1234 +      }
1235      }
1236  
1237 -  return allowed;
1238 +  if (result == BUS_RESULT_LATER)
1239 +    {
1240 +      BusContext *context = bus_connection_get_context(connection);
1241 +      BusCheck *check = bus_context_get_check(context);
1242 +      BusDeferredMessage *deferred_message;
1243 +
1244 +      result = bus_check_privilege(check, message, connection, NULL, NULL,
1245 +          privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message);
1246 +      if (result == BUS_RESULT_LATER)
1247 +        {
1248 +          bus_deferred_message_disable_sender(deferred_message);
1249 +        }
1250 +    }
1251 +
1252 +  return result;
1253  }
1254  
1255 -dbus_bool_t
1256 +BusResult
1257  bus_client_policy_check_can_own (BusClientPolicy  *policy,
1258 -                                 const DBusString *service_name)
1259 +                                 const DBusString *service_name,
1260 +                                 DBusConnection   *connection,
1261 +                                 DBusMessage      *message)
1262  {
1263 -  return bus_rules_check_can_own (policy->rules, service_name);
1264 +  return bus_rules_check_can_own (policy->rules, service_name, connection, message);
1265  }
1266  
1267  #ifdef DBUS_ENABLE_EMBEDDED_TESTS
1268 @@ -1455,7 +1487,7 @@ dbus_bool_t
1269  bus_policy_check_can_own (BusPolicy  *policy,
1270                            const DBusString *service_name)
1271  {
1272 -  return bus_rules_check_can_own (policy->default_rules, service_name);
1273 +  return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL) == BUS_RESULT_TRUE;
1274  }
1275  #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
1276  
1277 diff --git a/bus/policy.h b/bus/policy.h
1278 index f839d23..28ce8f2 100644
1279 --- a/bus/policy.h
1280 +++ b/bus/policy.h
1281 @@ -182,8 +182,10 @@ BusResult        bus_client_policy_check_can_receive (BusClientPolicy  *policy,
1282                                                        dbus_int32_t     *toggles,
1283                                                        const char      **privilege_param,
1284                                                        BusDeferredMessage **deferred_message);
1285 -dbus_bool_t      bus_client_policy_check_can_own     (BusClientPolicy  *policy,
1286 -                                                      const DBusString *service_name);
1287 +BusResult        bus_client_policy_check_can_own     (BusClientPolicy  *policy,
1288 +                                                      const DBusString *service_name,
1289 +                                                      DBusConnection   *connection,
1290 +                                                      DBusMessage      *message);
1291  dbus_bool_t      bus_client_policy_append_rule       (BusClientPolicy  *policy,
1292                                                        BusPolicyRule    *rule);
1293  void             bus_client_policy_optimize          (BusClientPolicy  *policy);
1294 diff --git a/bus/services.c b/bus/services.c
1295 index 127edda..586af18 100644
1296 --- a/bus/services.c
1297 +++ b/bus/services.c
1298 @@ -376,16 +376,17 @@ bus_registry_list_services (BusRegistry *registry,
1299    return FALSE;
1300  }
1301  
1302 -dbus_bool_t
1303 +BusResult
1304  bus_registry_acquire_service (BusRegistry      *registry,
1305                                DBusConnection   *connection,
1306 +                              DBusMessage      *message,
1307                                const DBusString *service_name,
1308                                dbus_uint32_t     flags,
1309                                dbus_uint32_t    *result,
1310                                BusTransaction   *transaction,
1311                                DBusError        *error)
1312  {
1313 -  dbus_bool_t retval;
1314 +  BusResult retval;
1315    DBusConnection *old_owner_conn;
1316    BusClientPolicy *policy;
1317    BusService *service;
1318 @@ -393,8 +394,9 @@ bus_registry_acquire_service (BusRegistry      *registry,
1319    BusSELinuxID *sid;
1320    BusOwner *primary_owner;
1321    int limit;
1322 +  BusResult res;
1323  
1324 -  retval = FALSE;
1325 +  retval = BUS_RESULT_FALSE;
1326  
1327    if (!_dbus_validate_bus_name (service_name, 0,
1328                                  _dbus_string_get_length (service_name)))
1329 @@ -467,7 +469,8 @@ bus_registry_acquire_service (BusRegistry      *registry,
1330                                              _dbus_string_get_const_data (service_name), error))
1331      goto out;
1332    
1333 -  if (!bus_client_policy_check_can_own (policy, service_name))
1334 +  res = bus_client_policy_check_can_own (policy, service_name, connection, message);
1335 +  if (res == BUS_RESULT_FALSE)
1336      {
1337        dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1338                        "Connection \"%s\" is not allowed to own the service \"%s\" due "
1339 @@ -478,6 +481,11 @@ bus_registry_acquire_service (BusRegistry      *registry,
1340                        _dbus_string_get_const_data (service_name));
1341        goto out;
1342      }
1343 +  else if (res == BUS_RESULT_LATER)
1344 +    {
1345 +      retval = BUS_RESULT_LATER;
1346 +      goto out;
1347 +    }
1348  
1349    limit = bus_context_get_max_services_per_connection (registry->context);
1350  
1351 @@ -603,11 +611,13 @@ bus_registry_acquire_service (BusRegistry      *registry,
1352      }
1353  
1354    activation = bus_context_get_activation (registry->context);
1355 -  retval = bus_activation_send_pending_auto_activation_messages (activation,
1356 +  
1357 +  if (bus_activation_send_pending_auto_activation_messages (activation,
1358                                                                  service,
1359 -                                                                transaction);
1360 -  if (!retval)
1361 -    BUS_SET_OOM (error);
1362 +                                                                transaction))
1363 +      retval = BUS_RESULT_TRUE;
1364 +  else
1365 +      BUS_SET_OOM (error);
1366    
1367   out:
1368    return retval;
1369 diff --git a/bus/services.h b/bus/services.h
1370 index 056dd9f..3df3dd7 100644
1371 --- a/bus/services.h
1372 +++ b/bus/services.h
1373 @@ -50,8 +50,9 @@ void         bus_registry_foreach         (BusRegistry                 *registry
1374  dbus_bool_t  bus_registry_list_services   (BusRegistry                 *registry,
1375                                             char                      ***listp,
1376                                             int                         *array_len);
1377 -dbus_bool_t  bus_registry_acquire_service (BusRegistry                 *registry,
1378 +BusResult    bus_registry_acquire_service (BusRegistry                 *registry,
1379                                             DBusConnection              *connection,
1380 +                                           DBusMessage                 *message,
1381                                             const DBusString            *service_name,
1382                                             dbus_uint32_t                flags,
1383                                             dbus_uint32_t               *result,
1384 diff --git a/bus/stats.c b/bus/stats.c
1385 index 1582255..c25be98 100644
1386 --- a/bus/stats.c
1387 +++ b/bus/stats.c
1388 @@ -36,7 +36,7 @@
1389  
1390  #ifdef DBUS_ENABLE_STATS
1391  
1392 -dbus_bool_t
1393 +BusResult
1394  bus_stats_handle_get_stats (DBusConnection *connection,
1395                              BusTransaction *transaction,
1396                              DBusMessage    *message,
1397 @@ -51,6 +51,9 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1398  
1399    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1400  
1401 +  if (!bus_driver_check_message_is_for_us (message, error))
1402 +    return BUS_RESULT_FALSE;
1403 +
1404    context = bus_transaction_get_context (transaction);
1405    connections = bus_context_get_connections (context);
1406  
1407 @@ -104,17 +107,17 @@ bus_stats_handle_get_stats (DBusConnection *connection,
1408      goto oom;
1409  
1410    dbus_message_unref (reply);
1411 -  return TRUE;
1412 +  return BUS_RESULT_TRUE;
1413  
1414  oom:
1415    if (reply != NULL)
1416      dbus_message_unref (reply);
1417  
1418    BUS_SET_OOM (error);
1419 -  return FALSE;
1420 +  return BUS_RESULT_FALSE;
1421  }
1422  
1423 -dbus_bool_t
1424 +BusResult
1425  bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1426                                         BusTransaction *transaction,
1427                                         DBusMessage    *message,
1428 @@ -209,7 +212,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1429      goto oom;
1430  
1431    dbus_message_unref (reply);
1432 -  return TRUE;
1433 +  return BUS_RESULT_TRUE;
1434  
1435  oom:
1436    BUS_SET_OOM (error);
1437 @@ -218,11 +221,11 @@ failed:
1438    if (reply != NULL)
1439      dbus_message_unref (reply);
1440  
1441 -  return FALSE;
1442 +  return BUS_RESULT_FALSE;
1443  }
1444  
1445  
1446 -dbus_bool_t
1447 +BusResult
1448  bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1449                                        BusTransaction *transaction,
1450                                        DBusMessage    *message,
1451 @@ -246,7 +249,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1452    matchmaker = bus_context_get_matchmaker (context);
1453  
1454    if (!bus_registry_list_services (registry, &services, &services_len))
1455 -    return FALSE;
1456 +    return BUS_RESULT_FALSE;
1457  
1458    reply = dbus_message_new_method_return (message);
1459    if (reply == NULL)
1460 @@ -325,7 +328,7 @@ bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1461  
1462    dbus_message_unref (reply);
1463    dbus_free_string_array (services);
1464 -  return TRUE;
1465 +  return BUS_RESULT_TRUE;
1466  
1467  oom:
1468    if (reply != NULL)
1469 @@ -334,7 +337,7 @@ oom:
1470    dbus_free_string_array (services);
1471  
1472    BUS_SET_OOM (error);
1473 -  return FALSE;
1474 +  return BUS_RESULT_FALSE;
1475  }
1476  
1477  #endif
1478 diff --git a/bus/stats.h b/bus/stats.h
1479 index dcb022c..683fa17 100644
1480 --- a/bus/stats.h
1481 +++ b/bus/stats.h
1482 @@ -25,17 +25,17 @@
1483  
1484  #define BUS_INTERFACE_STATS "org.freedesktop.DBus.Debug.Stats"
1485  
1486 -dbus_bool_t bus_stats_handle_get_stats (DBusConnection *connection,
1487 +BusResult bus_stats_handle_get_stats (DBusConnection *connection,
1488                                          BusTransaction *transaction,
1489                                          DBusMessage    *message,
1490                                          DBusError      *error);
1491  
1492 -dbus_bool_t bus_stats_handle_get_connection_stats (DBusConnection *connection,
1493 +BusResult bus_stats_handle_get_connection_stats (DBusConnection *connection,
1494                                                     BusTransaction *transaction,
1495                                                     DBusMessage    *message,
1496                                                     DBusError      *error);
1497  
1498 -dbus_bool_t bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1499 +BusResult bus_stats_handle_get_all_match_rules (DBusConnection *caller_connection,
1500                                                    BusTransaction *transaction,
1501                                                    DBusMessage    *message,
1502                                                    DBusError      *error);
1503 -- 
1504 2.21.1
1505