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