Integrate parts of meta-intel-iot-security
[AGL/meta-agl.git] / meta-security / recipes-core / dbus / dbus-cynara / 0007-Add-own-rule-result-unavailability-handling.patch
1 From 35ef89cd6777ea2430077fc621d21bd01df92349 Mon Sep 17 00:00:00 2001
2 From: Jacek Bukarewicz <j.bukarewicz@samsung.com>
3 Date: Thu, 27 Nov 2014 11:26:21 +0100
4 Subject: [PATCH 7/8] Add own rule result unavailability handling
5
6 Own rule result unavailability is handled like send rules - dispatching
7 messages from the sender is blocked and resumed when result becomes
8 available.
9
10 Handler of "RequestName" method needs to return BUS_RESULT_LATER when
11 policy result is not known therefore its return type is modified.
12 Since bus message handlers are put into function pointer array other
13 message handler function singatures are also affected.
14
15 Change-Id: I4c2cbd4585e41fccd8a30f825a8f0d342ab56755
16 ---
17  bus/dispatch.c |  11 ++-
18  bus/driver.c   | 227 ++++++++++++++++++++++++++++++---------------------------
19  bus/driver.h   |   2 +-
20  bus/policy.c   |  51 ++++++++++---
21  bus/policy.h   |   6 +-
22  bus/services.c |  26 +++++--
23  bus/services.h |   3 +-
24  bus/stats.c    |  16 ++--
25  8 files changed, 204 insertions(+), 138 deletions(-)
26
27 diff --git a/bus/dispatch.c b/bus/dispatch.c
28 index 9972e76..d3b970f 100644
29 --- a/bus/dispatch.c
30 +++ b/bus/dispatch.c
31 @@ -404,8 +404,17 @@ bus_dispatch (DBusConnection *connection,
32          }
33  
34        _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS);
35 -      if (!bus_driver_handle_message (connection, transaction, message, &error))
36 +      res = bus_driver_handle_message (connection, transaction, message, &error);
37 +      if (res == BUS_RESULT_FALSE)
38          goto out;
39 +      else if (res == BUS_RESULT_LATER)
40 +        {
41 +          /* connection has been disabled in message handler */
42 +          bus_transaction_cancel_and_free (transaction);
43 +          transaction = NULL;
44 +          result = DBUS_HANDLER_RESULT_LATER;
45 +          goto out;
46 +        }
47      }
48    else if (!bus_connection_is_active (connection)) /* clients must talk to bus driver first */
49      {
50 diff --git a/bus/driver.c b/bus/driver.c
51 index 2fb1385..9708f49 100644
52 --- a/bus/driver.c
53 +++ b/bus/driver.c
54 @@ -297,7 +297,7 @@ create_unique_client_name (BusRegistry *registry,
55    return TRUE;
56  }
57  
58 -static dbus_bool_t
59 +static BusResult
60  bus_driver_handle_hello (DBusConnection *connection,
61                           BusTransaction *transaction,
62                           DBusMessage    *message,
63 @@ -305,7 +305,7 @@ bus_driver_handle_hello (DBusConnection *connection,
64  {
65    DBusString unique_name;
66    BusService *service;
67 -  dbus_bool_t retval;
68 +  BusResult retval;
69    BusRegistry *registry;
70    BusConnections *connections;
71  
72 @@ -316,7 +316,7 @@ bus_driver_handle_hello (DBusConnection *connection,
73        /* We already handled an Hello message for this connection. */
74        dbus_set_error (error, DBUS_ERROR_FAILED,
75                        "Already handled an Hello message");
76 -      return FALSE;
77 +      return BUS_RESULT_FALSE;
78      }
79  
80    /* Note that when these limits are exceeded we don't disconnect the
81 @@ -330,16 +330,16 @@ bus_driver_handle_hello (DBusConnection *connection,
82                                       error))
83      {
84        _DBUS_ASSERT_ERROR_IS_SET (error);
85 -      return FALSE;
86 +      return BUS_RESULT_FALSE;
87      }
88  
89    if (!_dbus_string_init (&unique_name))
90      {
91        BUS_SET_OOM (error);
92 -      return FALSE;
93 +      return BUS_RESULT_FALSE;
94      }
95  
96 -  retval = FALSE;
97 +  retval = BUS_RESULT_FALSE;
98  
99    registry = bus_connection_get_registry (connection);
100  
101 @@ -372,7 +372,7 @@ bus_driver_handle_hello (DBusConnection *connection,
102      goto out_0;
103  
104    _dbus_assert (bus_connection_is_active (connection));
105 -  retval = TRUE;
106 +  retval = BUS_RESULT_TRUE;
107  
108   out_0:
109    _dbus_string_free (&unique_name);
110 @@ -424,7 +424,7 @@ bus_driver_send_welcome_message (DBusConnection *connection,
111      }
112  }
113  
114 -static dbus_bool_t
115 +static BusResult
116  bus_driver_handle_list_services (DBusConnection *connection,
117                                   BusTransaction *transaction,
118                                   DBusMessage    *message,
119 @@ -446,14 +446,14 @@ bus_driver_handle_list_services (DBusConnection *connection,
120    if (reply == NULL)
121      {
122        BUS_SET_OOM (error);
123 -      return FALSE;
124 +      return BUS_RESULT_FALSE;
125      }
126  
127    if (!bus_registry_list_services (registry, &services, &len))
128      {
129        dbus_message_unref (reply);
130        BUS_SET_OOM (error);
131 -      return FALSE;
132 +      return BUS_RESULT_FALSE;
133      }
134  
135    dbus_message_iter_init_append (reply, &iter);
136 @@ -465,7 +465,7 @@ bus_driver_handle_list_services (DBusConnection *connection,
137        dbus_free_string_array (services);
138        dbus_message_unref (reply);
139        BUS_SET_OOM (error);
140 -      return FALSE;
141 +      return BUS_RESULT_FALSE;
142      }
143  
144    {
145 @@ -477,7 +477,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 @@ -490,7 +490,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        ++i;
162      }
163 @@ -501,23 +501,23 @@ bus_driver_handle_list_services (DBusConnection *connection,
164      {
165        dbus_message_unref (reply);
166        BUS_SET_OOM (error);
167 -      return FALSE;
168 +      return BUS_RESULT_FALSE;
169      }
170  
171    if (!bus_transaction_send_from_driver (transaction, connection, reply))
172      {
173        dbus_message_unref (reply);
174        BUS_SET_OOM (error);
175 -      return FALSE;
176 +      return BUS_RESULT_FALSE;
177      }
178    else
179      {
180        dbus_message_unref (reply);
181 -      return TRUE;
182 +      return BUS_RESULT_TRUE;
183      }
184  }
185  
186 -static dbus_bool_t
187 +static BusResult
188  bus_driver_handle_list_activatable_services (DBusConnection *connection,
189                                              BusTransaction *transaction,
190                                              DBusMessage    *message,
191 @@ -539,14 +539,14 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
192    if (reply == NULL)
193      {
194        BUS_SET_OOM (error);
195 -      return FALSE;
196 +      return BUS_RESULT_FALSE;
197      }
198  
199    if (!bus_activation_list_services (activation, &services, &len))
200      {
201        dbus_message_unref (reply);
202        BUS_SET_OOM (error);
203 -      return FALSE;
204 +      return BUS_RESULT_FALSE;
205      }
206  
207    dbus_message_iter_init_append (reply, &iter);
208 @@ -558,7 +558,7 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
209        dbus_free_string_array (services);
210        dbus_message_unref (reply);
211        BUS_SET_OOM (error);
212 -      return FALSE;
213 +      return BUS_RESULT_FALSE;
214      }
215  
216    {
217 @@ -570,7 +570,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 @@ -583,7 +583,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        ++i;
234      }
235 @@ -594,23 +594,23 @@ bus_driver_handle_list_activatable_services (DBusConnection *connection,
236      {
237        dbus_message_unref (reply);
238        BUS_SET_OOM (error);
239 -      return FALSE;
240 +      return BUS_RESULT_FALSE;
241      }
242  
243    if (!bus_transaction_send_from_driver (transaction, connection, reply))
244      {
245        dbus_message_unref (reply);
246        BUS_SET_OOM (error);
247 -      return FALSE;
248 +      return BUS_RESULT_FALSE;
249      }
250    else
251      {
252        dbus_message_unref (reply);
253 -      return TRUE;
254 +      return BUS_RESULT_TRUE;
255      }
256  }
257  
258 -static dbus_bool_t
259 +static BusResult
260  bus_driver_handle_acquire_service (DBusConnection *connection,
261                                     BusTransaction *transaction,
262                                     DBusMessage    *message,
263 @@ -621,7 +621,8 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
264    const char *name;
265    dbus_uint32_t service_reply;
266    dbus_uint32_t flags;
267 -  dbus_bool_t retval;
268 +  BusResult retval;
269 +  BusResult res;
270    BusRegistry *registry;
271  
272    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
273 @@ -632,20 +633,24 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
274                                DBUS_TYPE_STRING, &name,
275                                DBUS_TYPE_UINT32, &flags,
276                                DBUS_TYPE_INVALID))
277 -    return FALSE;
278 +    return BUS_RESULT_FALSE;
279  
280    _dbus_verbose ("Trying to own name %s with flags 0x%x\n", name, flags);
281  
282 -  retval = FALSE;
283 +  retval = BUS_RESULT_FALSE;
284    reply = NULL;
285  
286    _dbus_string_init_const (&service_name, name);
287  
288 -  if (!bus_registry_acquire_service (registry, connection,
289 -                                     &service_name, flags,
290 -                                     &service_reply, transaction,
291 -                                     error))
292 -    goto out;
293 +  res = bus_registry_acquire_service (registry, connection, message,
294 +                                       &service_name, flags,
295 +                                       &service_reply, transaction,
296 +                                       error);
297 +  if (res != BUS_RESULT_TRUE)
298 +    {
299 +      retval = res;
300 +      goto out;
301 +    }
302  
303    reply = dbus_message_new_method_return (message);
304    if (reply == NULL)
305 @@ -666,7 +671,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
306        goto out;
307      }
308  
309 -  retval = TRUE;
310 +  retval = BUS_RESULT_TRUE;
311  
312   out:
313    if (reply)
314 @@ -674,7 +679,7 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
315    return retval;
316  }
317  
318 -static dbus_bool_t
319 +static BusResult
320  bus_driver_handle_release_service (DBusConnection *connection,
321                                     BusTransaction *transaction,
322                                     DBusMessage    *message,
323 @@ -684,7 +689,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
324    DBusString service_name;
325    const char *name;
326    dbus_uint32_t service_reply;
327 -  dbus_bool_t retval;
328 +  BusResult retval;
329    BusRegistry *registry;
330  
331    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
332 @@ -694,11 +699,11 @@ bus_driver_handle_release_service (DBusConnection *connection,
333    if (!dbus_message_get_args (message, error,
334                                DBUS_TYPE_STRING, &name,
335                                DBUS_TYPE_INVALID))
336 -    return FALSE;
337 +    return BUS_RESULT_FALSE;
338  
339    _dbus_verbose ("Trying to release name %s\n", name);
340  
341 -  retval = FALSE;
342 +  retval = BUS_RESULT_FALSE;
343    reply = NULL;
344  
345    _dbus_string_init_const (&service_name, name);
346 @@ -727,7 +732,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
347        goto out;
348      }
349  
350 -  retval = TRUE;
351 +  retval = BUS_RESULT_TRUE;
352  
353   out:
354    if (reply)
355 @@ -735,7 +740,7 @@ bus_driver_handle_release_service (DBusConnection *connection,
356    return retval;
357  }
358  
359 -static dbus_bool_t
360 +static BusResult
361  bus_driver_handle_service_exists (DBusConnection *connection,
362                                    BusTransaction *transaction,
363                                    DBusMessage    *message,
364 @@ -746,7 +751,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
365    BusService *service;
366    dbus_bool_t service_exists;
367    const char *name;
368 -  dbus_bool_t retval;
369 +  BusResult retval;
370    BusRegistry *registry;
371  
372    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
373 @@ -756,9 +761,9 @@ bus_driver_handle_service_exists (DBusConnection *connection,
374    if (!dbus_message_get_args (message, error,
375                                DBUS_TYPE_STRING, &name,
376                                DBUS_TYPE_INVALID))
377 -    return FALSE;
378 +    return BUS_RESULT_FALSE;
379  
380 -  retval = FALSE;
381 +  retval = BUS_RESULT_FALSE;
382  
383    if (strcmp (name, DBUS_SERVICE_DBUS) == 0)
384      {
385 @@ -792,7 +797,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
386        goto out;
387      }
388  
389 -  retval = TRUE;
390 +  retval = BUS_RESULT_TRUE;
391  
392   out:
393    if (reply)
394 @@ -801,7 +806,7 @@ bus_driver_handle_service_exists (DBusConnection *connection,
395    return retval;
396  }
397  
398 -static dbus_bool_t
399 +static BusResult
400  bus_driver_handle_activate_service (DBusConnection *connection,
401                                      BusTransaction *transaction,
402                                      DBusMessage    *message,
403 @@ -809,7 +814,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
404  {
405    dbus_uint32_t flags;
406    const char *name;
407 -  dbus_bool_t retval;
408 +  BusResult retval;
409    BusActivation *activation;
410  
411    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
412 @@ -823,10 +828,10 @@ bus_driver_handle_activate_service (DBusConnection *connection,
413      {
414        _DBUS_ASSERT_ERROR_IS_SET (error);
415        _dbus_verbose ("No memory to get arguments to StartServiceByName\n");
416 -      return FALSE;
417 +      return BUS_RESULT_FALSE;
418      }
419  
420 -  retval = FALSE;
421 +  retval = BUS_RESULT_FALSE;
422  
423    if (!bus_activation_activate_service (activation, connection, transaction, FALSE,
424                                          message, name, error))
425 @@ -836,7 +841,7 @@ bus_driver_handle_activate_service (DBusConnection *connection,
426        goto out;
427      }
428  
429 -  retval = TRUE;
430 +  retval = BUS_RESULT_TRUE;
431  
432   out:
433    return retval;
434 @@ -872,13 +877,13 @@ send_ack_reply (DBusConnection *connection,
435    return TRUE;
436  }
437  
438 -static dbus_bool_t
439 +static BusResult
440  bus_driver_handle_update_activation_environment (DBusConnection *connection,
441                                                   BusTransaction *transaction,
442                                                   DBusMessage    *message,
443                                                   DBusError      *error)
444  {
445 -  dbus_bool_t retval;
446 +  BusResult retval;
447    BusActivation *activation;
448    DBusMessageIter iter;
449    DBusMessageIter dict_iter;
450 @@ -939,7 +944,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
451  
452    dbus_message_iter_recurse (&iter, &dict_iter);
453  
454 -  retval = FALSE;
455 +  retval = BUS_RESULT_FALSE;
456  
457    /* Then loop through the sent dictionary, add the location of
458     * the environment keys and values to lists. The result will
459 @@ -1026,7 +1031,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
460                         message, error))
461      goto out;
462  
463 -  retval = TRUE;
464 +  retval = BUS_RESULT_TRUE;
465  
466   out:
467    _dbus_list_clear (&keys);
468 @@ -1034,7 +1039,7 @@ bus_driver_handle_update_activation_environment (DBusConnection *connection,
469    return retval;
470  }
471  
472 -static dbus_bool_t
473 +static BusResult
474  bus_driver_handle_add_match (DBusConnection *connection,
475                               BusTransaction *transaction,
476                               DBusMessage    *message,
477 @@ -1093,16 +1098,16 @@ bus_driver_handle_add_match (DBusConnection *connection,
478  
479    bus_match_rule_unref (rule);
480  
481 -  return TRUE;
482 +  return BUS_RESULT_TRUE;
483  
484   failed:
485    _DBUS_ASSERT_ERROR_IS_SET (error);
486    if (rule)
487      bus_match_rule_unref (rule);
488 -  return FALSE;
489 +  return BUS_RESULT_FALSE;
490  }
491  
492 -static dbus_bool_t
493 +static BusResult
494  bus_driver_handle_remove_match (DBusConnection *connection,
495                                  BusTransaction *transaction,
496                                  DBusMessage    *message,
497 @@ -1146,16 +1151,16 @@ bus_driver_handle_remove_match (DBusConnection *connection,
498  
499    bus_match_rule_unref (rule);
500  
501 -  return TRUE;
502 +  return BUS_RESULT_TRUE;
503  
504   failed:
505    _DBUS_ASSERT_ERROR_IS_SET (error);
506    if (rule)
507      bus_match_rule_unref (rule);
508 -  return FALSE;
509 +  return BUS_RESULT_FALSE;
510  }
511  
512 -static dbus_bool_t
513 +static BusResult
514  bus_driver_handle_get_service_owner (DBusConnection *connection,
515                                      BusTransaction *transaction,
516                                      DBusMessage    *message,
517 @@ -1225,7 +1230,7 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
518  
519    dbus_message_unref (reply);
520  
521 -  return TRUE;
522 +  return BUS_RESULT_TRUE;
523  
524   oom:
525    BUS_SET_OOM (error);
526 @@ -1234,10 +1239,10 @@ bus_driver_handle_get_service_owner (DBusConnection *connection,
527    _DBUS_ASSERT_ERROR_IS_SET (error);
528    if (reply)
529      dbus_message_unref (reply);
530 -  return FALSE;
531 +  return BUS_RESULT_FALSE;
532  }
533  
534 -static dbus_bool_t
535 +static BusResult
536  bus_driver_handle_list_queued_owners (DBusConnection *connection,
537                                       BusTransaction *transaction,
538                                       DBusMessage    *message,
539 @@ -1328,7 +1333,7 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
540  
541    dbus_message_unref (reply);
542  
543 -  return TRUE;
544 +  return BUS_RESULT_TRUE;
545  
546   oom:
547    BUS_SET_OOM (error);
548 @@ -1341,10 +1346,10 @@ bus_driver_handle_list_queued_owners (DBusConnection *connection,
549    if (base_names)
550      _dbus_list_clear (&base_names);
551  
552 -  return FALSE;
553 +  return BUS_RESULT_FALSE;
554  }
555  
556 -static dbus_bool_t
557 +static BusResult
558  bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
559                                              BusTransaction *transaction,
560                                              DBusMessage    *message,
561 @@ -1389,7 +1394,7 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
562  
563    dbus_message_unref (reply);
564  
565 -  return TRUE;
566 +  return BUS_RESULT_TRUE;
567  
568   oom:
569    BUS_SET_OOM (error);
570 @@ -1398,10 +1403,10 @@ bus_driver_handle_get_connection_unix_user (DBusConnection *connection,
571    _DBUS_ASSERT_ERROR_IS_SET (error);
572    if (reply)
573      dbus_message_unref (reply);
574 -  return FALSE;
575 +  return BUS_RESULT_FALSE;
576  }
577  
578 -static dbus_bool_t
579 +static BusResult
580  bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
581                                                   BusTransaction *transaction,
582                                                   DBusMessage    *message,
583 @@ -1446,7 +1451,7 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
584  
585    dbus_message_unref (reply);
586  
587 -  return TRUE;
588 +  return BUS_RESULT_TRUE;
589  
590   oom:
591    BUS_SET_OOM (error);
592 @@ -1455,10 +1460,10 @@ bus_driver_handle_get_connection_unix_process_id (DBusConnection *connection,
593    _DBUS_ASSERT_ERROR_IS_SET (error);
594    if (reply)
595      dbus_message_unref (reply);
596 -  return FALSE;
597 +  return BUS_RESULT_FALSE;
598  }
599  
600 -static dbus_bool_t
601 +static BusResult
602  bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
603                                               BusTransaction *transaction,
604                                               DBusMessage    *message,
605 @@ -1502,7 +1507,7 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
606  
607    dbus_message_unref (reply);
608  
609 -  return TRUE;
610 +  return BUS_RESULT_TRUE;
611  
612   oom:
613    BUS_SET_OOM (error);
614 @@ -1511,10 +1516,10 @@ bus_driver_handle_get_adt_audit_session_data (DBusConnection *connection,
615    _DBUS_ASSERT_ERROR_IS_SET (error);
616    if (reply)
617      dbus_message_unref (reply);
618 -  return FALSE;
619 +  return BUS_RESULT_FALSE;
620  }
621  
622 -static dbus_bool_t
623 +static BusResult
624  bus_driver_handle_get_connection_selinux_security_context (DBusConnection *connection,
625                                                            BusTransaction *transaction,
626                                                            DBusMessage    *message,
627 @@ -1556,7 +1561,7 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
628  
629    dbus_message_unref (reply);
630  
631 -  return TRUE;
632 +  return BUS_RESULT_TRUE;
633  
634   oom:
635    BUS_SET_OOM (error);
636 @@ -1565,10 +1570,10 @@ bus_driver_handle_get_connection_selinux_security_context (DBusConnection *conne
637    _DBUS_ASSERT_ERROR_IS_SET (error);
638    if (reply)
639      dbus_message_unref (reply);
640 -  return FALSE;
641 +  return BUS_RESULT_FALSE;
642  }
643  
644 -static dbus_bool_t
645 +static BusResult
646  bus_driver_handle_get_connection_credentials (DBusConnection *connection,
647                                                BusTransaction *transaction,
648                                                DBusMessage    *message,
649 @@ -1645,7 +1650,7 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
650  
651    dbus_message_unref (reply);
652  
653 -  return TRUE;
654 +  return BUS_RESULT_TRUE;
655  
656   oom:
657    BUS_SET_OOM (error);
658 @@ -1659,10 +1664,10 @@ bus_driver_handle_get_connection_credentials (DBusConnection *connection,
659        dbus_message_unref (reply);
660      }
661  
662 -  return FALSE;
663 +  return BUS_RESULT_FALSE;
664  }
665  
666 -static dbus_bool_t
667 +static BusResult
668  bus_driver_handle_reload_config (DBusConnection *connection,
669                                  BusTransaction *transaction,
670                                  DBusMessage    *message,
671 @@ -1687,7 +1692,7 @@ bus_driver_handle_reload_config (DBusConnection *connection,
672      goto oom;
673  
674    dbus_message_unref (reply);
675 -  return TRUE;
676 +  return BUS_RESULT_TRUE;
677  
678   oom:
679    BUS_SET_OOM (error);
680 @@ -1696,10 +1701,10 @@ bus_driver_handle_reload_config (DBusConnection *connection,
681    _DBUS_ASSERT_ERROR_IS_SET (error);
682    if (reply)
683      dbus_message_unref (reply);
684 -  return FALSE;
685 +  return BUS_RESULT_FALSE;
686  }
687  
688 -static dbus_bool_t
689 +static BusResult
690  bus_driver_handle_get_id (DBusConnection *connection,
691                            BusTransaction *transaction,
692                            DBusMessage    *message,
693 @@ -1715,7 +1720,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
694    if (!_dbus_string_init (&uuid))
695      {
696        BUS_SET_OOM (error);
697 -      return FALSE;
698 +      return BUS_RESULT_FALSE;
699      }
700  
701    reply = NULL;
702 @@ -1741,7 +1746,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
703  
704    _dbus_string_free (&uuid);
705    dbus_message_unref (reply);
706 -  return TRUE;
707 +  return BUS_RESULT_TRUE;
708  
709   oom:
710    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
711 @@ -1751,7 +1756,7 @@ bus_driver_handle_get_id (DBusConnection *connection,
712    if (reply)
713      dbus_message_unref (reply);
714    _dbus_string_free (&uuid);
715 -  return FALSE;
716 +  return BUS_RESULT_FALSE;
717  }
718  
719  typedef struct
720 @@ -1759,10 +1764,10 @@ typedef struct
721    const char *name;
722    const char *in_args;
723    const char *out_args;
724 -  dbus_bool_t (* handler) (DBusConnection *connection,
725 -                           BusTransaction *transaction,
726 -                           DBusMessage    *message,
727 -                           DBusError      *error);
728 +  BusResult (* handler) (DBusConnection *connection,
729 +                         BusTransaction *transaction,
730 +                         DBusMessage    *message,
731 +                         DBusError      *error);
732  } MessageHandler;
733  
734  /* For speed it might be useful to sort this in order of
735 @@ -1847,7 +1852,7 @@ static const MessageHandler dbus_message_handlers[] = {
736    { NULL, NULL, NULL, NULL }
737  };
738  
739 -static dbus_bool_t bus_driver_handle_introspect (DBusConnection *,
740 +static BusResult bus_driver_handle_introspect (DBusConnection *,
741      BusTransaction *, DBusMessage *, DBusError *);
742  
743  static const MessageHandler introspectable_message_handlers[] = {
744 @@ -1973,7 +1978,7 @@ bus_driver_generate_introspect_string (DBusString *xml)
745    return TRUE;
746  }
747  
748 -static dbus_bool_t
749 +static BusResult
750  bus_driver_handle_introspect (DBusConnection *connection,
751                                BusTransaction *transaction,
752                                DBusMessage    *message,
753 @@ -1993,13 +1998,13 @@ bus_driver_handle_introspect (DBusConnection *connection,
754                                DBUS_TYPE_INVALID))
755      {
756        _DBUS_ASSERT_ERROR_IS_SET (error);
757 -      return FALSE;
758 +      return BUS_RESULT_FALSE;
759      }
760  
761    if (!_dbus_string_init (&xml))
762      {
763        BUS_SET_OOM (error);
764 -      return FALSE;
765 +      return BUS_RESULT_FALSE;
766      }
767  
768    if (!bus_driver_generate_introspect_string (&xml))
769 @@ -2022,7 +2027,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
770    dbus_message_unref (reply);
771    _dbus_string_free (&xml);
772  
773 -  return TRUE;
774 +  return BUS_RESULT_TRUE;
775  
776   oom:
777    BUS_SET_OOM (error);
778 @@ -2032,7 +2037,7 @@ bus_driver_handle_introspect (DBusConnection *connection,
779  
780    _dbus_string_free (&xml);
781  
782 -  return FALSE;
783 +  return BUS_RESULT_FALSE;
784  }
785  
786  /*
787 @@ -2067,7 +2072,7 @@ bus_driver_check_message_is_for_us (DBusMessage *message,
788    return TRUE;
789  }
790  
791 -dbus_bool_t
792 +BusResult
793  bus_driver_handle_message (DBusConnection *connection,
794                             BusTransaction *transaction,
795                            DBusMessage    *message,
796 @@ -2077,6 +2082,7 @@ bus_driver_handle_message (DBusConnection *connection,
797    const InterfaceHandler *ih;
798    const MessageHandler *mh;
799    dbus_bool_t found_interface = FALSE;
800 +  BusResult res;
801  
802    _DBUS_ASSERT_ERROR_IS_CLEAR (error);
803  
804 @@ -2085,13 +2091,13 @@ bus_driver_handle_message (DBusConnection *connection,
805        BusContext *context;
806  
807        context = bus_connection_get_context (connection);
808 -      return dbus_activation_systemd_failure(bus_context_get_activation(context), message);
809 +      return dbus_activation_systemd_failure(bus_context_get_activation(context), message) == TRUE ? BUS_RESULT_TRUE : BUS_RESULT_FALSE;
810      }
811  
812    if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
813      {
814        _dbus_verbose ("Driver got a non-method-call message, ignoring\n");
815 -      return TRUE; /* we just ignore this */
816 +      return BUS_RESULT_TRUE; /* we just ignore this */
817      }
818  
819    /* may be NULL, which means "any interface will do" */
820 @@ -2133,20 +2139,27 @@ bus_driver_handle_message (DBusConnection *connection,
821                                name, dbus_message_get_signature (message),
822                                mh->in_args);
823                _DBUS_ASSERT_ERROR_IS_SET (error);
824 -              return FALSE;
825 +              return BUS_RESULT_FALSE;
826              }
827  
828 -          if ((* mh->handler) (connection, transaction, message, error))
829 +          res = (* mh->handler) (connection, transaction, message, error);
830 +          if (res == BUS_RESULT_TRUE)
831              {
832                _DBUS_ASSERT_ERROR_IS_CLEAR (error);
833                _dbus_verbose ("Driver handler succeeded\n");
834 -              return TRUE;
835 +              return BUS_RESULT_TRUE;
836              }
837 -          else
838 +          else if (res == BUS_RESULT_FALSE)
839              {
840                _DBUS_ASSERT_ERROR_IS_SET (error);
841                _dbus_verbose ("Driver handler returned failure\n");
842 -              return FALSE;
843 +              return BUS_RESULT_FALSE;
844 +            }
845 +          else if (res == BUS_RESULT_LATER)
846 +            {
847 +              _DBUS_ASSERT_ERROR_IS_CLEAR (error);
848 +              _dbus_verbose ("Driver handler delayed message processing due to policy check\n");
849 +              return BUS_RESULT_LATER;
850              }
851          }
852      }
853 @@ -2158,7 +2171,7 @@ bus_driver_handle_message (DBusConnection *connection,
854                    "%s does not understand message %s",
855                    DBUS_SERVICE_DBUS, name);
856  
857 -  return FALSE;
858 +  return BUS_RESULT_FALSE;
859  }
860  
861  void
862 diff --git a/bus/driver.h b/bus/driver.h
863 index 201709c..3ff4ff1 100644
864 --- a/bus/driver.h
865 +++ b/bus/driver.h
866 @@ -28,7 +28,7 @@
867  #include "connection.h"
868  
869  void        bus_driver_remove_connection     (DBusConnection *connection);
870 -dbus_bool_t bus_driver_handle_message        (DBusConnection *connection,
871 +BusResult   bus_driver_handle_message        (DBusConnection *connection,
872                                                BusTransaction *transaction,
873                                                DBusMessage    *message,
874                                                DBusError      *error);
875 diff --git a/bus/policy.c b/bus/policy.c
876 index 448147f..3672ff9 100644
877 --- a/bus/policy.c
878 +++ b/bus/policy.c
879 @@ -1323,18 +1323,21 @@ bus_client_policy_check_can_receive (BusClientPolicy     *policy,
880  
881  
882  
883 -static dbus_bool_t
884 +static BusResult
885  bus_rules_check_can_own (DBusList *rules,
886 -                         const DBusString *service_name)
887 +                         const DBusString *service_name,
888 +                         DBusConnection   *connection,
889 +                         DBusMessage      *message)
890  {
891    DBusList *link;
892 -  dbus_bool_t allowed;
893 +  BusResult result;
894 +  const char *privilege;
895    
896    /* rules is in the order the rules appeared
897     * in the config file, i.e. last rule that applies wins
898     */
899  
900 -  allowed = FALSE;
901 +  result = BUS_RESULT_FALSE;
902    link = _dbus_list_get_first_link (&rules);
903    while (link != NULL)
904      {
905 @@ -1370,17 +1373,45 @@ bus_rules_check_can_own (DBusList *rules,
906          }
907  
908        /* Use this rule */
909 -      allowed = rule->access == BUS_POLICY_RULE_ACCESS_ALLOW;
910 +      switch (rule->access)
911 +      {
912 +      case BUS_POLICY_RULE_ACCESS_ALLOW:
913 +        result = BUS_RESULT_TRUE;
914 +        break;
915 +      case BUS_POLICY_RULE_ACCESS_DENY:
916 +        result = BUS_RESULT_FALSE;
917 +        break;
918 +      case BUS_POLICY_RULE_ACCESS_CHECK:
919 +        result = BUS_RESULT_LATER;
920 +        privilege = rule->privilege;
921 +        break;
922 +      }
923      }
924  
925 -  return allowed;
926 +  if (result == BUS_RESULT_LATER)
927 +    {
928 +      BusContext *context = bus_connection_get_context(connection);
929 +      BusCheck *check = bus_context_get_check(context);
930 +      BusDeferredMessage *deferred_message;
931 +
932 +      result = bus_check_privilege(check, message, connection, NULL, NULL,
933 +          privilege, BUS_DEFERRED_MESSAGE_CHECK_OWN, &deferred_message);
934 +      if (result == BUS_RESULT_LATER)
935 +        {
936 +          bus_deferred_message_disable_sender(deferred_message);
937 +        }
938 +    }
939 +
940 +  return result;
941  }
942  
943 -dbus_bool_t
944 +BusResult
945  bus_client_policy_check_can_own (BusClientPolicy  *policy,
946 -                                 const DBusString *service_name)
947 +                                 const DBusString *service_name,
948 +                                 DBusConnection   *connection,
949 +                                 DBusMessage      *message)
950  {
951 -  return bus_rules_check_can_own (policy->rules, service_name);
952 +  return bus_rules_check_can_own (policy->rules, service_name, connection, message);
953  }
954  
955  #ifdef DBUS_ENABLE_EMBEDDED_TESTS
956 @@ -1388,7 +1419,7 @@ dbus_bool_t
957  bus_policy_check_can_own (BusPolicy  *policy,
958                            const DBusString *service_name)
959  {
960 -  return bus_rules_check_can_own (policy->default_rules, service_name);
961 +  return bus_rules_check_can_own (policy->default_rules, service_name, NULL, NULL);
962  }
963  #endif /* DBUS_ENABLE_EMBEDDED_TESTS */
964  
965 diff --git a/bus/policy.h b/bus/policy.h
966 index e9f193a..1f23431 100644
967 --- a/bus/policy.h
968 +++ b/bus/policy.h
969 @@ -170,8 +170,10 @@ BusResult        bus_client_policy_check_can_receive (BusClientPolicy     *polic
970                                                        dbus_int32_t        *toggles,
971                                                        const char         **privilege_param,
972                                                        BusDeferredMessage **deferred_message);
973 -dbus_bool_t      bus_client_policy_check_can_own     (BusClientPolicy  *policy,
974 -                                                      const DBusString *service_name);
975 +BusResult        bus_client_policy_check_can_own     (BusClientPolicy  *policy,
976 +                                                      const DBusString *service_name,
977 +                                                      DBusConnection   *connection,
978 +                                                      DBusMessage      *message);
979  dbus_bool_t      bus_client_policy_append_rule       (BusClientPolicy  *policy,
980                                                        BusPolicyRule    *rule);
981  void             bus_client_policy_optimize          (BusClientPolicy  *policy);
982 diff --git a/bus/services.c b/bus/services.c
983 index 584485b..f25fdf3 100644
984 --- a/bus/services.c
985 +++ b/bus/services.c
986 @@ -374,24 +374,26 @@ bus_registry_list_services (BusRegistry *registry,
987    return FALSE;
988  }
989  
990 -dbus_bool_t
991 +BusResult
992  bus_registry_acquire_service (BusRegistry      *registry,
993                                DBusConnection   *connection,
994 +                              DBusMessage      *message,
995                                const DBusString *service_name,
996                                dbus_uint32_t     flags,
997                                dbus_uint32_t    *result,
998                                BusTransaction   *transaction,
999                                DBusError        *error)
1000  {
1001 -  dbus_bool_t retval;
1002 +  BusResult retval;
1003    DBusConnection *old_owner_conn;
1004    BusClientPolicy *policy;
1005    BusService *service;
1006    BusActivation  *activation;
1007    BusSELinuxID *sid;
1008    BusOwner *primary_owner;
1009 +  BusResult res;
1010   
1011 -  retval = FALSE;
1012 +  retval = BUS_RESULT_FALSE;
1013  
1014    if (!_dbus_validate_bus_name (service_name, 0,
1015                                  _dbus_string_get_length (service_name)))
1016 @@ -459,7 +461,8 @@ bus_registry_acquire_service (BusRegistry      *registry,
1017        goto out;
1018      }
1019    
1020 -  if (!bus_client_policy_check_can_own (policy, service_name))
1021 +  res = bus_client_policy_check_can_own (policy, service_name, connection, message);
1022 +  if (res == BUS_RESULT_FALSE)
1023      {
1024        dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1025                        "Connection \"%s\" is not allowed to own the service \"%s\" due "
1026 @@ -470,6 +473,11 @@ bus_registry_acquire_service (BusRegistry      *registry,
1027                        _dbus_string_get_const_data (service_name));
1028        goto out;
1029      }
1030 +  else if (res == BUS_RESULT_LATER)
1031 +    {
1032 +      retval = BUS_RESULT_LATER;
1033 +      goto out;
1034 +    }
1035  
1036    if (bus_connection_get_n_services_owned (connection) >=
1037        bus_context_get_max_services_per_connection (registry->context))
1038 @@ -586,11 +594,13 @@ bus_registry_acquire_service (BusRegistry      *registry,
1039      }
1040  
1041    activation = bus_context_get_activation (registry->context);
1042 -  retval = bus_activation_send_pending_auto_activation_messages (activation,
1043 +  
1044 +  if (bus_activation_send_pending_auto_activation_messages (activation,
1045                                                                  service,
1046 -                                                                transaction);
1047 -  if (!retval)
1048 -    BUS_SET_OOM (error);
1049 +                                                                transaction))
1050 +      retval = BUS_RESULT_TRUE;
1051 +  else
1052 +      BUS_SET_OOM (error);
1053    
1054   out:
1055    return retval;
1056 diff --git a/bus/services.h b/bus/services.h
1057 index 056dd9f..3df3dd7 100644
1058 --- a/bus/services.h
1059 +++ b/bus/services.h
1060 @@ -50,8 +50,9 @@ void         bus_registry_foreach         (BusRegistry                 *registry
1061  dbus_bool_t  bus_registry_list_services   (BusRegistry                 *registry,
1062                                             char                      ***listp,
1063                                             int                         *array_len);
1064 -dbus_bool_t  bus_registry_acquire_service (BusRegistry                 *registry,
1065 +BusResult    bus_registry_acquire_service (BusRegistry                 *registry,
1066                                             DBusConnection              *connection,
1067 +                                           DBusMessage                 *message,
1068                                             const DBusString            *service_name,
1069                                             dbus_uint32_t                flags,
1070                                             dbus_uint32_t               *result,
1071 diff --git a/bus/stats.c b/bus/stats.c
1072 index 20321e5..61dc428 100644
1073 --- a/bus/stats.c
1074 +++ b/bus/stats.c
1075 @@ -35,7 +35,7 @@
1076  
1077  #ifdef DBUS_ENABLE_STATS
1078  
1079 -dbus_bool_t
1080 +BusResult
1081  bus_stats_handle_get_stats (DBusConnection *connection,
1082                              BusTransaction *transaction,
1083                              DBusMessage    *message,
1084 @@ -106,17 +106,17 @@ bus_stats_handle_get_stats (DBusConnection *connection,
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 -dbus_bool_t
1101 +BusResult
1102  bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1103                                         BusTransaction *transaction,
1104                                         DBusMessage    *message,
1105 @@ -143,7 +143,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1106    if (! dbus_message_get_args (message, error,
1107                                 DBUS_TYPE_STRING, &bus_name,
1108                                 DBUS_TYPE_INVALID))
1109 -      return FALSE;
1110 +      return BUS_RESULT_FALSE;
1111  
1112    _dbus_string_init_const (&bus_name_str, bus_name);
1113    service = bus_registry_lookup (registry, &bus_name_str);
1114 @@ -152,7 +152,7 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1115      {
1116        dbus_set_error (error, DBUS_ERROR_NAME_HAS_NO_OWNER,
1117                        "Bus name '%s' has no owner", bus_name);
1118 -      return FALSE;
1119 +      return BUS_RESULT_FALSE;
1120      }
1121  
1122    stats_connection = bus_service_get_primary_owners_connection (service);
1123 @@ -214,14 +214,14 @@ bus_stats_handle_get_connection_stats (DBusConnection *caller_connection,
1124      goto oom;
1125  
1126    dbus_message_unref (reply);
1127 -  return TRUE;
1128 +  return BUS_RESULT_TRUE;
1129  
1130  oom:
1131    if (reply != NULL)
1132      dbus_message_unref (reply);
1133  
1134    BUS_SET_OOM (error);
1135 -  return FALSE;
1136 +  return BUS_RESULT_FALSE;
1137  }
1138  
1139  #endif
1140 -- 
1141 2.1.4
1142