1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 2 /* bus.c message bus context object 3 * 4 * Copyright (C) 2003, 2004 Red Hat, Inc. 5 * 6 * Licensed under the Academic Free License version 2.1 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 * 22 */ 23 24 #include <config.h> 25 #include "bus.h" 26 #include "activation.h" 27 #include "connection.h" 28 #include "services.h" 29 #include "utils.h" 30 #include "policy.h" 31 #include "config-parser.h" 32 #include "signals.h" 33 #include "selinux.h" 34 #include "dir-watch.h" 35 #include <dbus/dbus-list.h> 36 #include <dbus/dbus-hash.h> 37 #include <dbus/dbus-credentials.h> 38 #include <dbus/dbus-internals.h> 39 #ifdef DBUS_CYGWIN 40 #include <signal.h> 41 #endif 42 43 struct BusContext 44 { 45 int refcount; 46 DBusGUID uuid; 47 char *config_file; 48 char *type; 49 char *servicehelper; 50 char *address; 51 #ifdef WANT_PIDFILE 52 char *pidfile; 53 #endif 54 char *user; 55 char *log_prefix; 56 DBusLoop *loop; 57 DBusList *servers; 58 BusConnections *connections; 59 BusActivation *activation; 60 BusRegistry *registry; 61 BusPolicy *policy; 62 BusMatchmaker *matchmaker; 63 BusLimits limits; 64 unsigned int fork : 1; 65 unsigned int syslog : 1; 66 unsigned int keep_umask : 1; 67 unsigned int allow_anonymous : 1; 68 unsigned int systemd_activation : 1; 69 }; 70 71 static dbus_int32_t server_data_slot = -1; 72 73 typedef struct 74 { 75 BusContext *context; 76 } BusServerData; 77 78 #define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot)) 79 80 static BusContext* 81 server_get_context (DBusServer *server) 82 { 83 BusContext *context; 84 BusServerData *bd; 85 86 if (!dbus_server_allocate_data_slot (&server_data_slot)) 87 return NULL; 88 89 bd = BUS_SERVER_DATA (server); 90 if (bd == NULL) 91 { 92 dbus_server_free_data_slot (&server_data_slot); 93 return NULL; 94 } 95 96 context = bd->context; 97 98 dbus_server_free_data_slot (&server_data_slot); 99 100 return context; 101 } 102 103 static dbus_bool_t 104 server_watch_callback (DBusWatch *watch, 105 unsigned int condition, 106 void *data) 107 { 108 /* FIXME this can be done in dbus-mainloop.c 109 * if the code in activation.c for the babysitter 110 * watch handler is fixed. 111 */ 112 113 return dbus_watch_handle (watch, condition); 114 } 115 116 static dbus_bool_t 117 add_server_watch (DBusWatch *watch, 118 void *data) 119 { 120 DBusServer *server = data; 121 BusContext *context; 122 123 context = server_get_context (server); 124 125 return _dbus_loop_add_watch (context->loop, 126 watch, server_watch_callback, server, 127 NULL); 128 } 129 130 static void 131 remove_server_watch (DBusWatch *watch, 132 void *data) 133 { 134 DBusServer *server = data; 135 BusContext *context; 136 137 context = server_get_context (server); 138 139 _dbus_loop_remove_watch (context->loop, 140 watch, server_watch_callback, server); 141 } 142 143 144 static void 145 server_timeout_callback (DBusTimeout *timeout, 146 void *data) 147 { 148 /* can return FALSE on OOM but we just let it fire again later */ 149 dbus_timeout_handle (timeout); 150 } 151 152 static dbus_bool_t 153 add_server_timeout (DBusTimeout *timeout, 154 void *data) 155 { 156 DBusServer *server = data; 157 BusContext *context; 158 159 context = server_get_context (server); 160 161 return _dbus_loop_add_timeout (context->loop, 162 timeout, server_timeout_callback, server, NULL); 163 } 164 165 static void 166 remove_server_timeout (DBusTimeout *timeout, 167 void *data) 168 { 169 DBusServer *server = data; 170 BusContext *context; 171 172 context = server_get_context (server); 173 174 _dbus_loop_remove_timeout (context->loop, 175 timeout, server_timeout_callback, server); 176 } 177 178 static void 179 new_connection_callback (DBusServer *server, 180 DBusConnection *new_connection, 181 void *data) 182 { 183 BusContext *context = data; 184 185 if (!bus_connections_setup_connection (context->connections, new_connection)) 186 { 187 _dbus_verbose ("No memory to setup new connection\n"); 188 189 /* if we don't do this, it will get unref'd without 190 * being disconnected... kind of strange really 191 * that we have to do this, people won't get it right 192 * in general. 193 */ 194 dbus_connection_close (new_connection); 195 } 196 197 dbus_connection_set_max_received_size (new_connection, 198 context->limits.max_incoming_bytes); 199 200 dbus_connection_set_max_message_size (new_connection, 201 context->limits.max_message_size); 202 203 dbus_connection_set_max_received_unix_fds (new_connection, 204 context->limits.max_incoming_unix_fds); 205 206 dbus_connection_set_max_message_unix_fds (new_connection, 207 context->limits.max_message_unix_fds); 208 209 dbus_connection_set_allow_anonymous (new_connection, 210 context->allow_anonymous); 211 212 /* on OOM, we won't have ref'd the connection so it will die. */ 213 } 214 215 static void 216 free_server_data (void *data) 217 { 218 BusServerData *bd = data; 219 220 dbus_free (bd); 221 } 222 223 static dbus_bool_t 224 setup_server (BusContext *context, 225 DBusServer *server, 226 char **auth_mechanisms, 227 DBusError *error) 228 { 229 BusServerData *bd; 230 231 bd = dbus_new0 (BusServerData, 1); 232 if (bd == NULL || !dbus_server_set_data (server, 233 server_data_slot, 234 bd, free_server_data)) 235 { 236 dbus_free (bd); 237 BUS_SET_OOM (error); 238 return FALSE; 239 } 240 241 bd->context = context; 242 243 if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms)) 244 { 245 BUS_SET_OOM (error); 246 return FALSE; 247 } 248 249 dbus_server_set_new_connection_function (server, 250 new_connection_callback, 251 context, NULL); 252 253 if (!dbus_server_set_watch_functions (server, 254 add_server_watch, 255 remove_server_watch, 256 NULL, 257 server, 258 NULL)) 259 { 260 BUS_SET_OOM (error); 261 return FALSE; 262 } 263 264 if (!dbus_server_set_timeout_functions (server, 265 add_server_timeout, 266 remove_server_timeout, 267 NULL, 268 server, NULL)) 269 { 270 BUS_SET_OOM (error); 271 return FALSE; 272 } 273 274 return TRUE; 275 } 276 277 /* This code only gets executed the first time the 278 * config files are parsed. It is not executed 279 * when config files are reloaded. 280 */ 281 static dbus_bool_t 282 process_config_first_time_only (BusContext *context, 283 BusConfigParser *parser, 284 const DBusString *address, 285 dbus_bool_t systemd_activation, 286 DBusError *error) 287 { 288 DBusString log_prefix; 289 DBusList *link; 290 DBusList **addresses; 291 const char *user, *pidfile; 292 char **auth_mechanisms; 293 DBusList **auth_mechanisms_list; 294 int len; 295 dbus_bool_t retval; 296 297 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 298 299 retval = FALSE; 300 auth_mechanisms = NULL; 301 302 context->systemd_activation = systemd_activation; 303 304 #ifdef WANT_PIDFILE 305 /* Check for an existing pid file. Of course this is a race; 306 * we'd have to use fcntl() locks on the pid file to 307 * avoid that. But we want to check for the pid file 308 * before overwriting any existing sockets, etc. 309 */ 310 pidfile = bus_config_parser_get_pidfile (parser); 311 if (pidfile != NULL) 312 { 313 DBusString u; 314 DBusStat stbuf; 315 316 _dbus_string_init_const (&u, pidfile); 317 318 if (_dbus_stat (&u, &stbuf, NULL)) 319 { 320 #ifdef DBUS_CYGWIN 321 DBusString p; 322 long /* int */ pid; 323 324 _dbus_string_init (&p); 325 _dbus_file_get_contents(&p, &u, NULL); 326 _dbus_string_parse_int(&p, 0, &pid, NULL); 327 _dbus_string_free(&p); 328 329 if ((kill((int)pid, 0))) { 330 dbus_set_error(NULL, DBUS_ERROR_FILE_EXISTS, 331 "pid %ld not running, removing stale pid file\n", 332 pid); 333 _dbus_delete_file(&u, NULL); 334 } else { 335 #endif 336 dbus_set_error (error, DBUS_ERROR_FAILED, 337 "The pid file \"%s\" exists, if the message bus is not running, remove this file", 338 pidfile); 339 goto failed; 340 #ifdef DBUS_CYGWIN 341 } 342 #endif 343 } 344 } 345 346 /* keep around the pid filename so we can delete it later */ 347 context->pidfile = _dbus_strdup (pidfile); 348 #endif 349 350 /* note that type may be NULL */ 351 context->type = _dbus_strdup (bus_config_parser_get_type (parser)); 352 if (bus_config_parser_get_type (parser) != NULL && context->type == NULL) 353 goto oom; 354 355 user = bus_config_parser_get_user (parser); 356 if (user != NULL) 357 { 358 context->user = _dbus_strdup (user); 359 if (context->user == NULL) 360 goto oom; 361 } 362 363 /* Set up the prefix for syslog messages */ 364 if (!_dbus_string_init (&log_prefix)) 365 goto oom; 366 if (context->type && !strcmp (context->type, "system")) 367 { 368 if (!_dbus_string_append (&log_prefix, "[system] ")) 369 goto oom; 370 } 371 else if (context->type && !strcmp (context->type, "session")) 372 { 373 DBusCredentials *credentials; 374 375 credentials = _dbus_credentials_new_from_current_process (); 376 if (!credentials) 377 goto oom; 378 if (!_dbus_string_append (&log_prefix, "[session ")) 379 goto oom; 380 if (!_dbus_credentials_to_string_append (credentials, &log_prefix)) 381 goto oom; 382 if (!_dbus_string_append (&log_prefix, "] ")) 383 goto oom; 384 _dbus_credentials_unref (credentials); 385 } 386 if (!_dbus_string_steal_data (&log_prefix, &context->log_prefix)) 387 goto oom; 388 _dbus_string_free (&log_prefix); 389 390 /* Build an array of auth mechanisms */ 391 392 auth_mechanisms_list = bus_config_parser_get_mechanisms (parser); 393 len = _dbus_list_get_length (auth_mechanisms_list); 394 395 if (len > 0) 396 { 397 int i; 398 399 auth_mechanisms = dbus_new0 (char*, len + 1); 400 if (auth_mechanisms == NULL) 401 goto oom; 402 403 i = 0; 404 link = _dbus_list_get_first_link (auth_mechanisms_list); 405 while (link != NULL) 406 { 407 auth_mechanisms[i] = _dbus_strdup (link->data); 408 if (auth_mechanisms[i] == NULL) 409 goto oom; 410 link = _dbus_list_get_next_link (auth_mechanisms_list, link); 411 } 412 } 413 else 414 { 415 auth_mechanisms = NULL; 416 } 417 418 /* Listen on our addresses */ 419 420 if (address) 421 { 422 DBusServer *server; 423 424 server = dbus_server_listen (_dbus_string_get_const_data(address), error); 425 if (server == NULL) 426 { 427 _DBUS_ASSERT_ERROR_IS_SET (error); 428 goto failed; 429 } 430 else if (!setup_server (context, server, auth_mechanisms, error)) 431 { 432 _DBUS_ASSERT_ERROR_IS_SET (error); 433 goto failed; 434 } 435 436 if (!_dbus_list_append (&context->servers, server)) 437 goto oom; 438 } 439 else 440 { 441 addresses = bus_config_parser_get_addresses (parser); 442 443 link = _dbus_list_get_first_link (addresses); 444 while (link != NULL) 445 { 446 DBusServer *server; 447 448 server = dbus_server_listen (link->data, error); 449 if (server == NULL) 450 { 451 _DBUS_ASSERT_ERROR_IS_SET (error); 452 goto failed; 453 } 454 else if (!setup_server (context, server, auth_mechanisms, error)) 455 { 456 _DBUS_ASSERT_ERROR_IS_SET (error); 457 goto failed; 458 } 459 460 if (!_dbus_list_append (&context->servers, server)) 461 goto oom; 462 463 link = _dbus_list_get_next_link (addresses, link); 464 } 465 } 466 467 context->fork = bus_config_parser_get_fork (parser); 468 context->syslog = bus_config_parser_get_syslog (parser); 469 context->keep_umask = bus_config_parser_get_keep_umask (parser); 470 context->allow_anonymous = bus_config_parser_get_allow_anonymous (parser); 471 472 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 473 retval = TRUE; 474 475 failed: 476 dbus_free_string_array (auth_mechanisms); 477 return retval; 478 479 oom: 480 BUS_SET_OOM (error); 481 dbus_free_string_array (auth_mechanisms); 482 return FALSE; 483 } 484 485 /* This code gets executed every time the config files 486 * are parsed: both during BusContext construction 487 * and on reloads. This function is slightly screwy 488 * since it can do a "half reload" in out-of-memory 489 * situations. Realistically, unlikely to ever matter. 490 */ 491 static dbus_bool_t 492 process_config_every_time (BusContext *context, 493 BusConfigParser *parser, 494 dbus_bool_t is_reload, 495 DBusError *error) 496 { 497 DBusString full_address; 498 DBusList *link; 499 DBusList **dirs; 500 BusActivation *new_activation; 501 char *addr; 502 const char *servicehelper; 503 char *s; 504 505 dbus_bool_t retval; 506 507 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 508 509 addr = NULL; 510 retval = FALSE; 511 512 if (!_dbus_string_init (&full_address)) 513 { 514 BUS_SET_OOM (error); 515 return FALSE; 516 } 517 518 /* get our limits and timeout lengths */ 519 bus_config_parser_get_limits (parser, &context->limits); 520 521 if (context->policy) 522 bus_policy_unref (context->policy); 523 context->policy = bus_config_parser_steal_policy (parser); 524 _dbus_assert (context->policy != NULL); 525 526 /* We have to build the address backward, so that 527 * <listen> later in the config file have priority 528 */ 529 link = _dbus_list_get_last_link (&context->servers); 530 while (link != NULL) 531 { 532 addr = dbus_server_get_address (link->data); 533 if (addr == NULL) 534 { 535 BUS_SET_OOM (error); 536 goto failed; 537 } 538 539 if (_dbus_string_get_length (&full_address) > 0) 540 { 541 if (!_dbus_string_append (&full_address, ";")) 542 { 543 BUS_SET_OOM (error); 544 goto failed; 545 } 546 } 547 548 if (!_dbus_string_append (&full_address, addr)) 549 { 550 BUS_SET_OOM (error); 551 goto failed; 552 } 553 554 dbus_free (addr); 555 addr = NULL; 556 557 link = _dbus_list_get_prev_link (&context->servers, link); 558 } 559 560 if (is_reload) 561 dbus_free (context->address); 562 563 if (!_dbus_string_copy_data (&full_address, &context->address)) 564 { 565 BUS_SET_OOM (error); 566 goto failed; 567 } 568 569 /* get the service directories */ 570 dirs = bus_config_parser_get_service_dirs (parser); 571 572 /* and the service helper */ 573 servicehelper = bus_config_parser_get_servicehelper (parser); 574 575 s = _dbus_strdup(servicehelper); 576 if (s == NULL && servicehelper != NULL) 577 { 578 BUS_SET_OOM (error); 579 goto failed; 580 } 581 else 582 { 583 dbus_free(context->servicehelper); 584 context->servicehelper = s; 585 } 586 587 /* Create activation subsystem */ 588 if (context->activation) 589 { 590 if (!bus_activation_reload (context->activation, &full_address, dirs, error)) 591 goto failed; 592 } 593 else 594 { 595 context->activation = bus_activation_new (context, &full_address, dirs, error); 596 } 597 598 if (context->activation == NULL) 599 { 600 _DBUS_ASSERT_ERROR_IS_SET (error); 601 goto failed; 602 } 603 604 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 605 retval = TRUE; 606 607 failed: 608 _dbus_string_free (&full_address); 609 610 if (addr) 611 dbus_free (addr); 612 613 return retval; 614 } 615 616 static dbus_bool_t 617 list_concat_new (DBusList **a, 618 DBusList **b, 619 DBusList **result) 620 { 621 DBusList *link; 622 623 *result = NULL; 624 625 link = _dbus_list_get_first_link (a); 626 for (link = _dbus_list_get_first_link (a); link; link = _dbus_list_get_next_link (a, link)) 627 { 628 if (!_dbus_list_append (result, link->data)) 629 goto oom; 630 } 631 for (link = _dbus_list_get_first_link (b); link; link = _dbus_list_get_next_link (b, link)) 632 { 633 if (!_dbus_list_append (result, link->data)) 634 goto oom; 635 } 636 637 return TRUE; 638 oom: 639 _dbus_list_clear (result); 640 return FALSE; 641 } 642 643 static dbus_bool_t 644 process_config_postinit (BusContext *context, 645 BusConfigParser *parser, 646 DBusError *error) 647 { 648 DBusHashTable *service_context_table; 649 DBusList *watched_dirs = NULL; 650 651 service_context_table = bus_config_parser_steal_service_context_table (parser); 652 if (!bus_registry_set_service_context_table (context->registry, 653 service_context_table)) 654 { 655 BUS_SET_OOM (error); 656 return FALSE; 657 } 658 659 _dbus_hash_table_unref (service_context_table); 660 661 /* We need to monitor both the configuration directories and directories 662 * containing .service files. 663 */ 664 if (!list_concat_new (bus_config_parser_get_conf_dirs (parser), 665 bus_config_parser_get_service_dirs (parser), 666 &watched_dirs)) 667 { 668 BUS_SET_OOM (error); 669 return FALSE; 670 } 671 672 bus_set_watched_dirs (context, &watched_dirs); 673 674 _dbus_list_clear (&watched_dirs); 675 676 return TRUE; 677 } 678 679 BusContext* 680 bus_context_new (const DBusString *config_file, 681 ForceForkSetting force_fork, 682 DBusPipe *print_addr_pipe, 683 DBusPipe *print_pid_pipe, 684 const DBusString *address, 685 dbus_bool_t systemd_activation, 686 DBusError *error) 687 { 688 DBusString log_prefix; 689 BusContext *context; 690 BusConfigParser *parser; 691 692 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 693 694 context = NULL; 695 parser = NULL; 696 697 if (!dbus_server_allocate_data_slot (&server_data_slot)) 698 { 699 BUS_SET_OOM (error); 700 return NULL; 701 } 702 703 context = dbus_new0 (BusContext, 1); 704 if (context == NULL) 705 { 706 BUS_SET_OOM (error); 707 goto failed; 708 } 709 context->refcount = 1; 710 711 _dbus_generate_uuid (&context->uuid); 712 713 if (!_dbus_string_copy_data (config_file, &context->config_file)) 714 { 715 BUS_SET_OOM (error); 716 goto failed; 717 } 718 719 context->loop = _dbus_loop_new (); 720 if (context->loop == NULL) 721 { 722 BUS_SET_OOM (error); 723 goto failed; 724 } 725 726 context->registry = bus_registry_new (context); 727 if (context->registry == NULL) 728 { 729 BUS_SET_OOM (error); 730 goto failed; 731 } 732 733 parser = bus_config_load (config_file, TRUE, NULL, error); 734 if (parser == NULL) 735 { 736 _DBUS_ASSERT_ERROR_IS_SET (error); 737 goto failed; 738 } 739 740 if (!process_config_first_time_only (context, parser, address, systemd_activation, error)) 741 { 742 _DBUS_ASSERT_ERROR_IS_SET (error); 743 goto failed; 744 } 745 if (!process_config_every_time (context, parser, FALSE, error)) 746 { 747 _DBUS_ASSERT_ERROR_IS_SET (error); 748 goto failed; 749 } 750 751 /* we need another ref of the server data slot for the context 752 * to own 753 */ 754 if (!dbus_server_allocate_data_slot (&server_data_slot)) 755 _dbus_assert_not_reached ("second ref of server data slot failed"); 756 757 /* Note that we don't know whether the print_addr_pipe is 758 * one of the sockets we're using to listen on, or some 759 * other random thing. But I think the answer is "don't do 760 * that then" 761 */ 762 if (print_addr_pipe != NULL && _dbus_pipe_is_valid (print_addr_pipe)) 763 { 764 DBusString addr; 765 const char *a = bus_context_get_address (context); 766 int bytes; 767 768 _dbus_assert (a != NULL); 769 if (!_dbus_string_init (&addr)) 770 { 771 BUS_SET_OOM (error); 772 goto failed; 773 } 774 775 if (!_dbus_string_append (&addr, a) || 776 !_dbus_string_append (&addr, "\n")) 777 { 778 _dbus_string_free (&addr); 779 BUS_SET_OOM (error); 780 goto failed; 781 } 782 783 bytes = _dbus_string_get_length (&addr); 784 if (_dbus_pipe_write (print_addr_pipe, &addr, 0, bytes, error) != bytes) 785 { 786 /* pipe write returns an error on failure but not short write */ 787 if (error != NULL && !dbus_error_is_set (error)) 788 { 789 dbus_set_error (error, DBUS_ERROR_FAILED, 790 "Printing message bus address: did not write all bytes\n"); 791 } 792 _dbus_string_free (&addr); 793 goto failed; 794 } 795 796 if (!_dbus_pipe_is_stdout_or_stderr (print_addr_pipe)) 797 _dbus_pipe_close (print_addr_pipe, NULL); 798 799 _dbus_string_free (&addr); 800 } 801 802 context->connections = bus_connections_new (context); 803 if (context->connections == NULL) 804 { 805 BUS_SET_OOM (error); 806 goto failed; 807 } 808 809 context->matchmaker = bus_matchmaker_new (); 810 if (context->matchmaker == NULL) 811 { 812 BUS_SET_OOM (error); 813 goto failed; 814 } 815 816 /* check user before we fork */ 817 if (context->user != NULL) 818 { 819 if (!_dbus_verify_daemon_user (context->user)) 820 { 821 dbus_set_error (error, DBUS_ERROR_FAILED, 822 "Could not get UID and GID for username \"%s\"", 823 context->user); 824 goto failed; 825 } 826 } 827 828 /* Now become a daemon if appropriate and write out pid file in any case */ 829 { 830 #ifdef WANT_PIDFILE 831 DBusString u; 832 833 if (context->pidfile) 834 _dbus_string_init_const (&u, context->pidfile); 835 836 if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS) 837 { 838 _dbus_verbose ("Forking and becoming daemon\n"); 839 840 if (!_dbus_become_daemon (context->pidfile ? &u : NULL, 841 print_pid_pipe, 842 error, 843 context->keep_umask)) 844 845 { 846 _DBUS_ASSERT_ERROR_IS_SET (error); 847 goto failed; 848 } 849 } 850 else 851 { 852 _dbus_verbose ("Fork not requested\n"); 853 854 /* Need to write PID file and to PID pipe for ourselves, 855 * not for the child process. This is a no-op if the pidfile 856 * is NULL and print_pid_pipe is NULL. 857 */ 858 if (!_dbus_write_pid_to_file_and_pipe (context->pidfile ? &u : NULL, 859 print_pid_pipe, 860 _dbus_getpid (), 861 error)) 862 { 863 _DBUS_ASSERT_ERROR_IS_SET (error); 864 goto failed; 865 } 866 } 867 #else 868 if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS) 869 { 870 if (!_dbus_become_daemon (NULL, 871 0, 872 error, 873 context->keep_umask)) 874 { 875 _DBUS_ASSERT_ERROR_IS_SET (error); 876 goto failed; 877 } 878 } 879 #endif 880 } 881 882 if (print_pid_pipe && _dbus_pipe_is_valid (print_pid_pipe) && 883 !_dbus_pipe_is_stdout_or_stderr (print_pid_pipe)) 884 _dbus_pipe_close (print_pid_pipe, NULL); 885 886 if (!bus_selinux_full_init ()) 887 { 888 bus_context_log (context, DBUS_SYSTEM_LOG_FATAL, "SELinux enabled but AVC initialization failed; check system log\n"); 889 } 890 891 if (!process_config_postinit (context, parser, error)) 892 { 893 _DBUS_ASSERT_ERROR_IS_SET (error); 894 goto failed; 895 } 896 897 if (parser != NULL) 898 { 899 bus_config_parser_unref (parser); 900 parser = NULL; 901 } 902 903 /* Here we change our credentials if required, 904 * as soon as we've set up our sockets and pidfile 905 */ 906 if (context->user != NULL) 907 { 908 if (!_dbus_change_to_daemon_user (context->user, error)) 909 { 910 _DBUS_ASSERT_ERROR_IS_SET (error); 911 goto failed; 912 } 913 914 #ifdef HAVE_SELINUX 915 /* FIXME - why not just put this in full_init() below? */ 916 bus_selinux_audit_init (); 917 #endif 918 } 919 920 dbus_server_free_data_slot (&server_data_slot); 921 922 return context; 923 924 failed: 925 if (parser != NULL) 926 bus_config_parser_unref (parser); 927 if (context != NULL) 928 bus_context_unref (context); 929 930 if (server_data_slot >= 0) 931 dbus_server_free_data_slot (&server_data_slot); 932 933 return NULL; 934 } 935 936 dbus_bool_t 937 bus_context_get_id (BusContext *context, 938 DBusString *uuid) 939 { 940 return _dbus_uuid_encode (&context->uuid, uuid); 941 } 942 943 dbus_bool_t 944 bus_context_reload_config (BusContext *context, 945 DBusError *error) 946 { 947 BusConfigParser *parser; 948 DBusString config_file; 949 dbus_bool_t ret; 950 951 /* Flush the user database cache */ 952 _dbus_flush_caches (); 953 954 ret = FALSE; 955 _dbus_string_init_const (&config_file, context->config_file); 956 parser = bus_config_load (&config_file, TRUE, NULL, error); 957 if (parser == NULL) 958 { 959 _DBUS_ASSERT_ERROR_IS_SET (error); 960 goto failed; 961 } 962 963 if (!process_config_every_time (context, parser, TRUE, error)) 964 { 965 _DBUS_ASSERT_ERROR_IS_SET (error); 966 goto failed; 967 } 968 if (!process_config_postinit (context, parser, error)) 969 { 970 _DBUS_ASSERT_ERROR_IS_SET (error); 971 goto failed; 972 } 973 ret = TRUE; 974 975 bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Reloaded configuration"); 976 failed: 977 if (!ret) 978 bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Unable to reload configuration: %s", error->message); 979 if (parser != NULL) 980 bus_config_parser_unref (parser); 981 return ret; 982 } 983 984 static void 985 shutdown_server (BusContext *context, 986 DBusServer *server) 987 { 988 if (server == NULL || 989 !dbus_server_get_is_connected (server)) 990 return; 991 992 if (!dbus_server_set_watch_functions (server, 993 NULL, NULL, NULL, 994 context, 995 NULL)) 996 _dbus_assert_not_reached ("setting watch functions to NULL failed"); 997 998 if (!dbus_server_set_timeout_functions (server, 999 NULL, NULL, NULL, 1000 context, 1001 NULL)) 1002 _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 1003 1004 dbus_server_disconnect (server); 1005 } 1006 1007 void 1008 bus_context_shutdown (BusContext *context) 1009 { 1010 DBusList *link; 1011 1012 link = _dbus_list_get_first_link (&context->servers); 1013 while (link != NULL) 1014 { 1015 shutdown_server (context, link->data); 1016 1017 link = _dbus_list_get_next_link (&context->servers, link); 1018 } 1019 } 1020 1021 BusContext * 1022 bus_context_ref (BusContext *context) 1023 { 1024 _dbus_assert (context->refcount > 0); 1025 context->refcount += 1; 1026 1027 return context; 1028 } 1029 1030 void 1031 bus_context_unref (BusContext *context) 1032 { 1033 _dbus_assert (context->refcount > 0); 1034 context->refcount -= 1; 1035 1036 if (context->refcount == 0) 1037 { 1038 DBusList *link; 1039 1040 _dbus_verbose ("Finalizing bus context %p\n", context); 1041 1042 bus_context_shutdown (context); 1043 1044 if (context->connections) 1045 { 1046 bus_connections_unref (context->connections); 1047 context->connections = NULL; 1048 } 1049 1050 if (context->registry) 1051 { 1052 bus_registry_unref (context->registry); 1053 context->registry = NULL; 1054 } 1055 1056 if (context->activation) 1057 { 1058 bus_activation_unref (context->activation); 1059 context->activation = NULL; 1060 } 1061 1062 link = _dbus_list_get_first_link (&context->servers); 1063 while (link != NULL) 1064 { 1065 dbus_server_unref (link->data); 1066 1067 link = _dbus_list_get_next_link (&context->servers, link); 1068 } 1069 _dbus_list_clear (&context->servers); 1070 1071 if (context->policy) 1072 { 1073 bus_policy_unref (context->policy); 1074 context->policy = NULL; 1075 } 1076 1077 if (context->loop) 1078 { 1079 _dbus_loop_unref (context->loop); 1080 context->loop = NULL; 1081 } 1082 1083 if (context->matchmaker) 1084 { 1085 bus_matchmaker_unref (context->matchmaker); 1086 context->matchmaker = NULL; 1087 } 1088 1089 dbus_free (context->config_file); 1090 dbus_free (context->log_prefix); 1091 dbus_free (context->type); 1092 dbus_free (context->address); 1093 dbus_free (context->user); 1094 dbus_free (context->servicehelper); 1095 1096 #ifdef WANT_PIDFILE 1097 if (context->pidfile) 1098 { 1099 DBusString u; 1100 _dbus_string_init_const (&u, context->pidfile); 1101 1102 /* Deliberately ignore errors here, since there's not much 1103 * we can do about it, and we're exiting anyways. 1104 */ 1105 _dbus_delete_file (&u, NULL); 1106 1107 dbus_free (context->pidfile); 1108 } 1109 #endif 1110 1111 dbus_free (context); 1112 1113 dbus_server_free_data_slot (&server_data_slot); 1114 } 1115 } 1116 1117 /* type may be NULL */ 1118 const char* 1119 bus_context_get_type (BusContext *context) 1120 { 1121 return context->type; 1122 } 1123 1124 const char* 1125 bus_context_get_address (BusContext *context) 1126 { 1127 return context->address; 1128 } 1129 1130 const char* 1131 bus_context_get_servicehelper (BusContext *context) 1132 { 1133 return context->servicehelper; 1134 } 1135 1136 dbus_bool_t 1137 bus_context_get_systemd_activation (BusContext *context) 1138 { 1139 return context->systemd_activation; 1140 } 1141 1142 BusRegistry* 1143 bus_context_get_registry (BusContext *context) 1144 { 1145 return context->registry; 1146 } 1147 1148 BusConnections* 1149 bus_context_get_connections (BusContext *context) 1150 { 1151 return context->connections; 1152 } 1153 1154 BusActivation* 1155 bus_context_get_activation (BusContext *context) 1156 { 1157 return context->activation; 1158 } 1159 1160 BusMatchmaker* 1161 bus_context_get_matchmaker (BusContext *context) 1162 { 1163 return context->matchmaker; 1164 } 1165 1166 DBusLoop* 1167 bus_context_get_loop (BusContext *context) 1168 { 1169 return context->loop; 1170 } 1171 1172 dbus_bool_t 1173 bus_context_allow_unix_user (BusContext *context, 1174 unsigned long uid) 1175 { 1176 return bus_policy_allow_unix_user (context->policy, 1177 uid); 1178 } 1179 1180 /* For now this is never actually called because the default 1181 * DBusConnection behavior of 'same user that owns the bus can connect' 1182 * is all it would do. 1183 */ 1184 dbus_bool_t 1185 bus_context_allow_windows_user (BusContext *context, 1186 const char *windows_sid) 1187 { 1188 return bus_policy_allow_windows_user (context->policy, 1189 windows_sid); 1190 } 1191 1192 BusPolicy * 1193 bus_context_get_policy (BusContext *context) 1194 { 1195 return context->policy; 1196 } 1197 1198 BusClientPolicy* 1199 bus_context_create_client_policy (BusContext *context, 1200 DBusConnection *connection, 1201 DBusError *error) 1202 { 1203 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 1204 return bus_policy_create_client_policy (context->policy, connection, 1205 error); 1206 } 1207 1208 int 1209 bus_context_get_activation_timeout (BusContext *context) 1210 { 1211 1212 return context->limits.activation_timeout; 1213 } 1214 1215 int 1216 bus_context_get_auth_timeout (BusContext *context) 1217 { 1218 return context->limits.auth_timeout; 1219 } 1220 1221 int 1222 bus_context_get_max_completed_connections (BusContext *context) 1223 { 1224 return context->limits.max_completed_connections; 1225 } 1226 1227 int 1228 bus_context_get_max_incomplete_connections (BusContext *context) 1229 { 1230 return context->limits.max_incomplete_connections; 1231 } 1232 1233 int 1234 bus_context_get_max_connections_per_user (BusContext *context) 1235 { 1236 return context->limits.max_connections_per_user; 1237 } 1238 1239 int 1240 bus_context_get_max_pending_activations (BusContext *context) 1241 { 1242 return context->limits.max_pending_activations; 1243 } 1244 1245 int 1246 bus_context_get_max_services_per_connection (BusContext *context) 1247 { 1248 return context->limits.max_services_per_connection; 1249 } 1250 1251 int 1252 bus_context_get_max_match_rules_per_connection (BusContext *context) 1253 { 1254 return context->limits.max_match_rules_per_connection; 1255 } 1256 1257 int 1258 bus_context_get_max_replies_per_connection (BusContext *context) 1259 { 1260 return context->limits.max_replies_per_connection; 1261 } 1262 1263 int 1264 bus_context_get_reply_timeout (BusContext *context) 1265 { 1266 return context->limits.reply_timeout; 1267 } 1268 1269 void 1270 bus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...) _DBUS_GNUC_PRINTF (3, 4); 1271 1272 void 1273 bus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...) 1274 { 1275 va_list args; 1276 1277 if (!context->syslog) 1278 return; 1279 1280 va_start (args, msg); 1281 1282 if (context->log_prefix) 1283 { 1284 DBusString full_msg; 1285 1286 if (!_dbus_string_init (&full_msg)) 1287 goto out; 1288 if (!_dbus_string_append (&full_msg, context->log_prefix)) 1289 goto oom_out; 1290 if (!_dbus_string_append_printf_valist (&full_msg, msg, args)) 1291 goto oom_out; 1292 1293 _dbus_system_log (severity, "%s", _dbus_string_get_const_data (&full_msg)); 1294 oom_out: 1295 _dbus_string_free (&full_msg); 1296 } 1297 else 1298 _dbus_system_logv (severity, msg, args); 1299 1300 out: 1301 va_end (args); 1302 } 1303 1304 /* 1305 * addressed_recipient is the recipient specified in the message. 1306 * 1307 * proposed_recipient is the recipient we're considering sending 1308 * to right this second, and may be an eavesdropper. 1309 * 1310 * sender is the sender of the message. 1311 * 1312 * NULL for proposed_recipient or sender definitely means the bus driver. 1313 * 1314 * NULL for addressed_recipient may mean the bus driver, or may mean 1315 * no destination was specified in the message (e.g. a signal). 1316 */ 1317 dbus_bool_t 1318 bus_context_check_security_policy (BusContext *context, 1319 BusTransaction *transaction, 1320 DBusConnection *sender, 1321 DBusConnection *addressed_recipient, 1322 DBusConnection *proposed_recipient, 1323 DBusMessage *message, 1324 DBusError *error) 1325 { 1326 const char *dest; 1327 BusClientPolicy *sender_policy; 1328 BusClientPolicy *recipient_policy; 1329 dbus_int32_t toggles; 1330 dbus_bool_t log; 1331 int type; 1332 dbus_bool_t requested_reply; 1333 const char *sender_name; 1334 const char *sender_loginfo; 1335 const char *proposed_recipient_loginfo; 1336 1337 type = dbus_message_get_type (message); 1338 dest = dbus_message_get_destination (message); 1339 1340 /* dispatch.c was supposed to ensure these invariants */ 1341 _dbus_assert (dest != NULL || 1342 type == DBUS_MESSAGE_TYPE_SIGNAL || 1343 (sender == NULL && !bus_connection_is_active (proposed_recipient))); 1344 _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL || 1345 addressed_recipient != NULL || 1346 strcmp (dest, DBUS_SERVICE_DBUS) == 0); 1347 1348 /* Used in logging below */ 1349 if (sender != NULL) 1350 { 1351 sender_name = bus_connection_get_name (sender); 1352 sender_loginfo = bus_connection_get_loginfo (sender); 1353 } 1354 else 1355 { 1356 sender_name = NULL; 1357 sender_loginfo = "(bus)"; 1358 } 1359 1360 if (proposed_recipient != NULL) 1361 proposed_recipient_loginfo = bus_connection_get_loginfo (proposed_recipient); 1362 else 1363 proposed_recipient_loginfo = "bus"; 1364 1365 switch (type) 1366 { 1367 case DBUS_MESSAGE_TYPE_METHOD_CALL: 1368 case DBUS_MESSAGE_TYPE_SIGNAL: 1369 case DBUS_MESSAGE_TYPE_METHOD_RETURN: 1370 case DBUS_MESSAGE_TYPE_ERROR: 1371 break; 1372 1373 default: 1374 _dbus_verbose ("security check disallowing message of unknown type %d\n", 1375 type); 1376 1377 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 1378 "Message bus will not accept messages of unknown type\n"); 1379 1380 return FALSE; 1381 } 1382 1383 requested_reply = FALSE; 1384 1385 if (sender != NULL) 1386 { 1387 /* First verify the SELinux access controls. If allowed then 1388 * go on with the standard checks. 1389 */ 1390 if (!bus_selinux_allows_send (sender, proposed_recipient, 1391 dbus_message_type_to_string (dbus_message_get_type (message)), 1392 dbus_message_get_interface (message), 1393 dbus_message_get_member (message), 1394 dbus_message_get_error_name (message), 1395 dest ? dest : DBUS_SERVICE_DBUS, error)) 1396 { 1397 if (error != NULL && !dbus_error_is_set (error)) 1398 { 1399 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 1400 "An SELinux policy prevents this sender " 1401 "from sending this message to this recipient " 1402 "(rejected message had sender \"%s\" interface \"%s\" " 1403 "member \"%s\" error name \"%s\" destination \"%s\")", 1404 sender_name ? sender_name : "(unset)", 1405 dbus_message_get_interface (message) ? 1406 dbus_message_get_interface (message) : "(unset)", 1407 dbus_message_get_member (message) ? 1408 dbus_message_get_member (message) : "(unset)", 1409 dbus_message_get_error_name (message) ? 1410 dbus_message_get_error_name (message) : "(unset)", 1411 dest ? dest : DBUS_SERVICE_DBUS); 1412 _dbus_verbose ("SELinux security check denying send to service\n"); 1413 } 1414 1415 return FALSE; 1416 } 1417 1418 if (bus_connection_is_active (sender)) 1419 { 1420 sender_policy = bus_connection_get_policy (sender); 1421 _dbus_assert (sender_policy != NULL); 1422 1423 /* Fill in requested_reply variable with TRUE if this is a 1424 * reply and the reply was pending. 1425 */ 1426 if (dbus_message_get_reply_serial (message) != 0) 1427 { 1428 if (proposed_recipient != NULL /* not to the bus driver */ && 1429 addressed_recipient == proposed_recipient /* not eavesdropping */) 1430 { 1431 DBusError error2; 1432 1433 dbus_error_init (&error2); 1434 requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender), 1435 transaction, 1436 sender, addressed_recipient, message, 1437 &error2); 1438 if (dbus_error_is_set (&error2)) 1439 { 1440 dbus_move_error (&error2, error); 1441 return FALSE; 1442 } 1443 } 1444 } 1445 } 1446 else 1447 { 1448 /* Policy for inactive connections is that they can only send 1449 * the hello message to the bus driver 1450 */ 1451 if (proposed_recipient == NULL && 1452 dbus_message_is_method_call (message, 1453 DBUS_INTERFACE_DBUS, 1454 "Hello")) 1455 { 1456 _dbus_verbose ("security check allowing %s message\n", 1457 "Hello"); 1458 return TRUE; 1459 } 1460 else 1461 { 1462 _dbus_verbose ("security check disallowing non-%s message\n", 1463 "Hello"); 1464 1465 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, 1466 "Client tried to send a message other than %s without being registered", 1467 "Hello"); 1468 1469 return FALSE; 1470 } 1471 } 1472 } 1473 else 1474 { 1475 sender_policy = NULL; 1476 1477 /* If the sender is the bus driver, we assume any reply was a 1478 * requested reply as bus driver won't send bogus ones 1479 */ 1480 if (addressed_recipient == proposed_recipient /* not eavesdropping */ && 1481 dbus_message_get_reply_serial (message) != 0) 1482 requested_reply = TRUE; 1483 } 1484 1485 _dbus_assert ((sender != NULL && sender_policy != NULL) || 1486 (sender == NULL && sender_policy == NULL)); 1487 1488 if (proposed_recipient != NULL) 1489 { 1490 /* only the bus driver can send to an inactive recipient (as it 1491 * owns no services, so other apps can't address it). Inactive 1492 * recipients can receive any message. 1493 */ 1494 if (bus_connection_is_active (proposed_recipient)) 1495 { 1496 recipient_policy = bus_connection_get_policy (proposed_recipient); 1497 _dbus_assert (recipient_policy != NULL); 1498 } 1499 else if (sender == NULL) 1500 { 1501 _dbus_verbose ("security check using NULL recipient policy for message from bus\n"); 1502 recipient_policy = NULL; 1503 } 1504 else 1505 { 1506 _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n"); 1507 recipient_policy = NULL; 1508 } 1509 } 1510 else 1511 recipient_policy = NULL; 1512 1513 _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) || 1514 (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) || 1515 (proposed_recipient == NULL && recipient_policy == NULL)); 1516 1517 log = FALSE; 1518 if (sender_policy && 1519 !bus_client_policy_check_can_send (sender_policy, 1520 context->registry, 1521 requested_reply, 1522 proposed_recipient, 1523 message, &toggles, &log)) 1524 { 1525 const char *msg = "Rejected send message, %d matched rules; " 1526 "type=\"%s\", sender=\"%s\" (%s) interface=\"%s\" member=\"%s\" error name=\"%s\" requested_reply=%d destination=\"%s\" (%s))"; 1527 1528 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, msg, 1529 toggles, 1530 dbus_message_type_to_string (dbus_message_get_type (message)), 1531 sender_name ? sender_name : "(unset)", 1532 sender_loginfo, 1533 dbus_message_get_interface (message) ? 1534 dbus_message_get_interface (message) : "(unset)", 1535 dbus_message_get_member (message) ? 1536 dbus_message_get_member (message) : "(unset)", 1537 dbus_message_get_error_name (message) ? 1538 dbus_message_get_error_name (message) : "(unset)", 1539 requested_reply, 1540 dest ? dest : DBUS_SERVICE_DBUS, 1541 proposed_recipient_loginfo); 1542 /* Needs to be duplicated to avoid calling malloc and having to handle OOM */ 1543 if (addressed_recipient == proposed_recipient) 1544 bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY, msg, 1545 toggles, 1546 dbus_message_type_to_string (dbus_message_get_type (message)), 1547 sender_name ? sender_name : "(unset)", 1548 sender_loginfo, 1549 dbus_message_get_interface (message) ? 1550 dbus_message_get_interface (message) : "(unset)", 1551 dbus_message_get_member (message) ? 1552 dbus_message_get_member (message) : "(unset)", 1553 dbus_message_get_error_name (message) ? 1554 dbus_message_get_error_name (message) : "(unset)", 1555 requested_reply, 1556 dest ? dest : DBUS_SERVICE_DBUS, 1557 proposed_recipient_loginfo); 1558 _dbus_verbose ("security policy disallowing message due to sender policy\n"); 1559 return FALSE; 1560 } 1561 1562 if (log) 1563 bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY, 1564 "Would reject message, %d matched rules; " 1565 "type=\"%s\", sender=\"%s\" (%s) interface=\"%s\" member=\"%s\" error name=\"%s\" requested_reply=%d destination=\"%s\" (%s))", 1566 toggles, 1567 dbus_message_type_to_string (dbus_message_get_type (message)), 1568 sender_name ? sender_name : "(unset)", 1569 sender_loginfo, 1570 dbus_message_get_interface (message) ? 1571 dbus_message_get_interface (message) : "(unset)", 1572 dbus_message_get_member (message) ? 1573 dbus_message_get_member (message) : "(unset)", 1574 dbus_message_get_error_name (message) ? 1575 dbus_message_get_error_name (message) : "(unset)", 1576 requested_reply, 1577 dest ? dest : DBUS_SERVICE_DBUS, 1578 proposed_recipient_loginfo); 1579 1580 if (recipient_policy && 1581 !bus_client_policy_check_can_receive (recipient_policy, 1582 context->registry, 1583 requested_reply, 1584 sender, 1585 addressed_recipient, proposed_recipient, 1586 message, &toggles)) 1587 { 1588 const char *msg = "Rejected receive message, %d matched rules; " 1589 "type=\"%s\" sender=\"%s\" (%s) interface=\"%s\" member=\"%s\" error name=\"%s\" reply serial=%u requested_reply=%d destination=\"%s\" (%s))"; 1590 1591 dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, msg, 1592 toggles, 1593 dbus_message_type_to_string (dbus_message_get_type (message)), 1594 sender_name ? sender_name : "(unset)", 1595 sender_loginfo, 1596 dbus_message_get_interface (message) ? 1597 dbus_message_get_interface (message) : "(unset)", 1598 dbus_message_get_member (message) ? 1599 dbus_message_get_member (message) : "(unset)", 1600 dbus_message_get_error_name (message) ? 1601 dbus_message_get_error_name (message) : "(unset)", 1602 dbus_message_get_reply_serial (message), 1603 requested_reply, 1604 dest ? dest : DBUS_SERVICE_DBUS, 1605 proposed_recipient_loginfo); 1606 /* Needs to be duplicated to avoid calling malloc and having to handle OOM */ 1607 if (addressed_recipient == proposed_recipient) 1608 bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY, msg, 1609 toggles, 1610 dbus_message_type_to_string (dbus_message_get_type (message)), 1611 sender_name ? sender_name : "(unset)", 1612 sender_loginfo, 1613 dbus_message_get_interface (message) ? 1614 dbus_message_get_interface (message) : "(unset)", 1615 dbus_message_get_member (message) ? 1616 dbus_message_get_member (message) : "(unset)", 1617 dbus_message_get_error_name (message) ? 1618 dbus_message_get_error_name (message) : "(unset)", 1619 dbus_message_get_reply_serial (message), 1620 requested_reply, 1621 dest ? dest : DBUS_SERVICE_DBUS, 1622 proposed_recipient_loginfo); 1623 _dbus_verbose ("security policy disallowing message due to recipient policy\n"); 1624 return FALSE; 1625 } 1626 1627 /* See if limits on size have been exceeded */ 1628 if (proposed_recipient && 1629 ((dbus_connection_get_outgoing_size (proposed_recipient) > context->limits.max_outgoing_bytes) || 1630 (dbus_connection_get_outgoing_unix_fds (proposed_recipient) > context->limits.max_outgoing_unix_fds))) 1631 { 1632 dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED, 1633 "The destination service \"%s\" has a full message queue", 1634 dest ? dest : (proposed_recipient ? 1635 bus_connection_get_name (proposed_recipient) : 1636 DBUS_SERVICE_DBUS)); 1637 _dbus_verbose ("security policy disallowing message due to full message queue\n"); 1638 return FALSE; 1639 } 1640 1641 /* Record that we will allow a reply here in the future (don't 1642 * bother if the recipient is the bus or this is an eavesdropping 1643 * connection). Only the addressed recipient may reply. 1644 */ 1645 if (type == DBUS_MESSAGE_TYPE_METHOD_CALL && 1646 sender && 1647 addressed_recipient && 1648 addressed_recipient == proposed_recipient && /* not eavesdropping */ 1649 !bus_connections_expect_reply (bus_connection_get_connections (sender), 1650 transaction, 1651 sender, addressed_recipient, 1652 message, error)) 1653 { 1654 _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n"); 1655 return FALSE; 1656 } 1657 1658 _dbus_verbose ("security policy allowing message\n"); 1659 return TRUE; 1660 } 1661