LCOV - code coverage report
Current view: top level - libsystemd/sd-bus - bus-internal.h (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 2 2 100.0 %
Date: 2019-08-23 13:36:53 Functions: 1 1 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 3 4 75.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : #pragma once
       3                 :            : 
       4                 :            : #include <pthread.h>
       5                 :            : #include <sys/socket.h>
       6                 :            : 
       7                 :            : #include "sd-bus.h"
       8                 :            : 
       9                 :            : #include "bus-error.h"
      10                 :            : #include "bus-kernel.h"
      11                 :            : #include "bus-match.h"
      12                 :            : #include "def.h"
      13                 :            : #include "hashmap.h"
      14                 :            : #include "list.h"
      15                 :            : #include "prioq.h"
      16                 :            : #include "socket-util.h"
      17                 :            : #include "time-util.h"
      18                 :            : 
      19                 :            : /* Note that we use the new /run prefix here (instead of /var/run) since we require them to be aliases and
      20                 :            :  * that way we become independent of /var being mounted */
      21                 :            : #define DEFAULT_SYSTEM_BUS_ADDRESS "unix:path=/run/dbus/system_bus_socket"
      22                 :            : #define DEFAULT_USER_BUS_ADDRESS_FMT "unix:path=%s/bus"
      23                 :            : 
      24                 :            : struct reply_callback {
      25                 :            :         sd_bus_message_handler_t callback;
      26                 :            :         usec_t timeout_usec; /* this is a relative timeout until we reach the BUS_HELLO state, and an absolute one right after */
      27                 :            :         uint64_t cookie;
      28                 :            :         unsigned prioq_idx;
      29                 :            : };
      30                 :            : 
      31                 :            : struct filter_callback {
      32                 :            :         sd_bus_message_handler_t callback;
      33                 :            : 
      34                 :            :         unsigned last_iteration;
      35                 :            : 
      36                 :            :         LIST_FIELDS(struct filter_callback, callbacks);
      37                 :            : };
      38                 :            : 
      39                 :            : struct match_callback {
      40                 :            :         sd_bus_message_handler_t callback;
      41                 :            :         sd_bus_message_handler_t install_callback;
      42                 :            : 
      43                 :            :         sd_bus_slot *install_slot; /* The AddMatch() call */
      44                 :            : 
      45                 :            :         unsigned last_iteration;
      46                 :            : 
      47                 :            :         /* Don't dispatch this slot with with messages that arrived in any iteration before or at the this
      48                 :            :          * one. We use this to ensure that matches don't apply "retroactively" and thus can confuse the
      49                 :            :          * caller: matches will only match incoming messages from the moment on the match was installed. */
      50                 :            :         uint64_t after;
      51                 :            : 
      52                 :            :         char *match_string;
      53                 :            : 
      54                 :            :         struct bus_match_node *match_node;
      55                 :            : };
      56                 :            : 
      57                 :            : struct node {
      58                 :            :         char *path;
      59                 :            :         struct node *parent;
      60                 :            :         LIST_HEAD(struct node, child);
      61                 :            :         LIST_FIELDS(struct node, siblings);
      62                 :            : 
      63                 :            :         LIST_HEAD(struct node_callback, callbacks);
      64                 :            :         LIST_HEAD(struct node_vtable, vtables);
      65                 :            :         LIST_HEAD(struct node_enumerator, enumerators);
      66                 :            :         LIST_HEAD(struct node_object_manager, object_managers);
      67                 :            : };
      68                 :            : 
      69                 :            : struct node_callback {
      70                 :            :         struct node *node;
      71                 :            : 
      72                 :            :         bool is_fallback:1;
      73                 :            :         unsigned last_iteration;
      74                 :            : 
      75                 :            :         sd_bus_message_handler_t callback;
      76                 :            : 
      77                 :            :         LIST_FIELDS(struct node_callback, callbacks);
      78                 :            : };
      79                 :            : 
      80                 :            : struct node_enumerator {
      81                 :            :         struct node *node;
      82                 :            : 
      83                 :            :         sd_bus_node_enumerator_t callback;
      84                 :            : 
      85                 :            :         unsigned last_iteration;
      86                 :            : 
      87                 :            :         LIST_FIELDS(struct node_enumerator, enumerators);
      88                 :            : };
      89                 :            : 
      90                 :            : struct node_object_manager {
      91                 :            :         struct node *node;
      92                 :            : 
      93                 :            :         LIST_FIELDS(struct node_object_manager, object_managers);
      94                 :            : };
      95                 :            : 
      96                 :            : struct node_vtable {
      97                 :            :         struct node *node;
      98                 :            : 
      99                 :            :         bool is_fallback:1;
     100                 :            :         unsigned last_iteration;
     101                 :            : 
     102                 :            :         char *interface;
     103                 :            :         const sd_bus_vtable *vtable;
     104                 :            :         sd_bus_object_find_t find;
     105                 :            : 
     106                 :            :         LIST_FIELDS(struct node_vtable, vtables);
     107                 :            : };
     108                 :            : 
     109                 :            : struct vtable_member {
     110                 :            :         const char *path;
     111                 :            :         const char *interface;
     112                 :            :         const char *member;
     113                 :            :         struct node_vtable *parent;
     114                 :            :         unsigned last_iteration;
     115                 :            :         const sd_bus_vtable *vtable;
     116                 :            : };
     117                 :            : 
     118                 :            : typedef enum BusSlotType {
     119                 :            :         BUS_REPLY_CALLBACK,
     120                 :            :         BUS_FILTER_CALLBACK,
     121                 :            :         BUS_MATCH_CALLBACK,
     122                 :            :         BUS_NODE_CALLBACK,
     123                 :            :         BUS_NODE_ENUMERATOR,
     124                 :            :         BUS_NODE_VTABLE,
     125                 :            :         BUS_NODE_OBJECT_MANAGER,
     126                 :            :         _BUS_SLOT_INVALID = -1,
     127                 :            : } BusSlotType;
     128                 :            : 
     129                 :            : struct sd_bus_slot {
     130                 :            :         unsigned n_ref;
     131                 :            :         BusSlotType type:5;
     132                 :            : 
     133                 :            :         /* Slots can be "floating" or not. If they are not floating (the usual case) then they reference the bus object
     134                 :            :          * they are associated with. This means the bus object stays allocated at least as long as there is a slot
     135                 :            :          * around associated with it. If it is floating, then the slot's lifecycle is bound to the lifecycle of the
     136                 :            :          * bus: it will be disconnected from the bus when the bus is destroyed, and it keeping the slot reffed hence
     137                 :            :          * won't mean the bus stays reffed too. Internally this means the reference direction is reversed: floating
     138                 :            :          * slots objects are referenced by the bus object, and not vice versa. */
     139                 :            :         bool floating:1;
     140                 :            : 
     141                 :            :         bool match_added:1;
     142                 :            : 
     143                 :            :         sd_bus *bus;
     144                 :            :         void *userdata;
     145                 :            :         sd_bus_destroy_t destroy_callback;
     146                 :            : 
     147                 :            :         char *description;
     148                 :            : 
     149                 :            :         LIST_FIELDS(sd_bus_slot, slots);
     150                 :            : 
     151                 :            :         union {
     152                 :            :                 struct reply_callback reply_callback;
     153                 :            :                 struct filter_callback filter_callback;
     154                 :            :                 struct match_callback match_callback;
     155                 :            :                 struct node_callback node_callback;
     156                 :            :                 struct node_enumerator node_enumerator;
     157                 :            :                 struct node_object_manager node_object_manager;
     158                 :            :                 struct node_vtable node_vtable;
     159                 :            :         };
     160                 :            : };
     161                 :            : 
     162                 :            : enum bus_state {
     163                 :            :         BUS_UNSET,
     164                 :            :         BUS_WATCH_BIND,      /* waiting for the socket to appear via inotify */
     165                 :            :         BUS_OPENING,         /* the kernel's connect() is still not ready */
     166                 :            :         BUS_AUTHENTICATING,  /* we are currently in the "SASL" authorization phase of dbus */
     167                 :            :         BUS_HELLO,           /* we are waiting for the Hello() response */
     168                 :            :         BUS_RUNNING,
     169                 :            :         BUS_CLOSING,
     170                 :            :         BUS_CLOSED,
     171                 :            :         _BUS_STATE_MAX,
     172                 :            : };
     173                 :            : 
     174                 :       2940 : static inline bool BUS_IS_OPEN(enum bus_state state) {
     175   [ +  -  +  + ]:       2940 :         return state > BUS_UNSET && state < BUS_CLOSING;
     176                 :            : }
     177                 :            : 
     178                 :            : enum bus_auth {
     179                 :            :         _BUS_AUTH_INVALID,
     180                 :            :         BUS_AUTH_EXTERNAL,
     181                 :            :         BUS_AUTH_ANONYMOUS
     182                 :            : };
     183                 :            : 
     184                 :            : struct sd_bus {
     185                 :            :         unsigned n_ref;
     186                 :            : 
     187                 :            :         enum bus_state state;
     188                 :            :         int input_fd, output_fd;
     189                 :            :         int inotify_fd;
     190                 :            :         int message_version;
     191                 :            :         int message_endian;
     192                 :            : 
     193                 :            :         bool can_fds:1;
     194                 :            :         bool bus_client:1;
     195                 :            :         bool ucred_valid:1;
     196                 :            :         bool is_server:1;
     197                 :            :         bool anonymous_auth:1;
     198                 :            :         bool prefer_readv:1;
     199                 :            :         bool prefer_writev:1;
     200                 :            :         bool match_callbacks_modified:1;
     201                 :            :         bool filter_callbacks_modified:1;
     202                 :            :         bool nodes_modified:1;
     203                 :            :         bool trusted:1;
     204                 :            :         bool manual_peer_interface:1;
     205                 :            :         bool is_system:1;
     206                 :            :         bool is_user:1;
     207                 :            :         bool allow_interactive_authorization:1;
     208                 :            :         bool exit_on_disconnect:1;
     209                 :            :         bool exited:1;
     210                 :            :         bool exit_triggered:1;
     211                 :            :         bool is_local:1;
     212                 :            :         bool watch_bind:1;
     213                 :            :         bool is_monitor:1;
     214                 :            :         bool accept_fd:1;
     215                 :            :         bool attach_timestamp:1;
     216                 :            :         bool connected_signal:1;
     217                 :            :         bool close_on_exit:1;
     218                 :            : 
     219                 :            :         signed int use_memfd:2;
     220                 :            : 
     221                 :            :         void *rbuffer;
     222                 :            :         size_t rbuffer_size;
     223                 :            : 
     224                 :            :         sd_bus_message **rqueue;
     225                 :            :         size_t rqueue_size;
     226                 :            :         size_t rqueue_allocated;
     227                 :            : 
     228                 :            :         sd_bus_message **wqueue;
     229                 :            :         size_t wqueue_size;
     230                 :            :         size_t windex;
     231                 :            :         size_t wqueue_allocated;
     232                 :            : 
     233                 :            :         uint64_t cookie;
     234                 :            :         uint64_t read_counter; /* A counter for each incoming msg */
     235                 :            : 
     236                 :            :         char *unique_name;
     237                 :            :         uint64_t unique_id;
     238                 :            : 
     239                 :            :         struct bus_match_node match_callbacks;
     240                 :            :         Prioq *reply_callbacks_prioq;
     241                 :            :         OrderedHashmap *reply_callbacks;
     242                 :            :         LIST_HEAD(struct filter_callback, filter_callbacks);
     243                 :            : 
     244                 :            :         Hashmap *nodes;
     245                 :            :         Hashmap *vtable_methods;
     246                 :            :         Hashmap *vtable_properties;
     247                 :            : 
     248                 :            :         union sockaddr_union sockaddr;
     249                 :            :         socklen_t sockaddr_size;
     250                 :            : 
     251                 :            :         pid_t nspid;
     252                 :            :         char *machine;
     253                 :            : 
     254                 :            :         sd_id128_t server_id;
     255                 :            : 
     256                 :            :         char *address;
     257                 :            :         unsigned address_index;
     258                 :            : 
     259                 :            :         int last_connect_error;
     260                 :            : 
     261                 :            :         enum bus_auth auth;
     262                 :            :         unsigned auth_index;
     263                 :            :         struct iovec auth_iovec[3];
     264                 :            :         size_t auth_rbegin;
     265                 :            :         char *auth_buffer;
     266                 :            :         usec_t auth_timeout;
     267                 :            : 
     268                 :            :         struct ucred ucred;
     269                 :            :         char *label;
     270                 :            :         gid_t *groups;
     271                 :            :         size_t n_groups;
     272                 :            : 
     273                 :            :         uint64_t creds_mask;
     274                 :            : 
     275                 :            :         int *fds;
     276                 :            :         size_t n_fds;
     277                 :            : 
     278                 :            :         char *exec_path;
     279                 :            :         char **exec_argv;
     280                 :            : 
     281                 :            :         /* We do locking around the memfd cache, since we want to
     282                 :            :          * allow people to process a sd_bus_message in a different
     283                 :            :          * thread then it was generated on and free it there. Since
     284                 :            :          * adding something to the memfd cache might happen when a
     285                 :            :          * message is released, we hence need to protect this bit with
     286                 :            :          * a mutex. */
     287                 :            :         pthread_mutex_t memfd_cache_mutex;
     288                 :            :         struct memfd_cache memfd_cache[MEMFD_CACHE_MAX];
     289                 :            :         unsigned n_memfd_cache;
     290                 :            : 
     291                 :            :         pid_t original_pid;
     292                 :            :         pid_t busexec_pid;
     293                 :            : 
     294                 :            :         unsigned iteration_counter;
     295                 :            : 
     296                 :            :         sd_event_source *input_io_event_source;
     297                 :            :         sd_event_source *output_io_event_source;
     298                 :            :         sd_event_source *time_event_source;
     299                 :            :         sd_event_source *quit_event_source;
     300                 :            :         sd_event_source *inotify_event_source;
     301                 :            :         sd_event *event;
     302                 :            :         int event_priority;
     303                 :            : 
     304                 :            :         pid_t tid;
     305                 :            : 
     306                 :            :         sd_bus_message *current_message;
     307                 :            :         sd_bus_slot *current_slot;
     308                 :            :         sd_bus_message_handler_t current_handler;
     309                 :            :         void *current_userdata;
     310                 :            : 
     311                 :            :         sd_bus **default_bus_ptr;
     312                 :            : 
     313                 :            :         char *description;
     314                 :            :         char *patch_sender;
     315                 :            : 
     316                 :            :         sd_bus_track *track_queue;
     317                 :            : 
     318                 :            :         LIST_HEAD(sd_bus_slot, slots);
     319                 :            :         LIST_HEAD(sd_bus_track, tracks);
     320                 :            : 
     321                 :            :         int *inotify_watches;
     322                 :            :         size_t n_inotify_watches;
     323                 :            : 
     324                 :            :         /* zero means use value specified by $SYSTEMD_BUS_TIMEOUT= environment variable or built-in default */
     325                 :            :         usec_t method_call_timeout;
     326                 :            : };
     327                 :            : 
     328                 :            : /* For method calls we timeout at 25s, like in the D-Bus reference implementation */
     329                 :            : #define BUS_DEFAULT_TIMEOUT ((usec_t) (25 * USEC_PER_SEC))
     330                 :            : 
     331                 :            : /* For the authentication phase we grant 90s, to provide extra room during boot, when RNGs and such are not filled up
     332                 :            :  * with enough entropy yet and might delay the boot */
     333                 :            : #define BUS_AUTH_TIMEOUT ((usec_t) DEFAULT_TIMEOUT_USEC)
     334                 :            : 
     335                 :            : #define BUS_WQUEUE_MAX (384*1024)
     336                 :            : #define BUS_RQUEUE_MAX (384*1024)
     337                 :            : 
     338                 :            : #define BUS_MESSAGE_SIZE_MAX (128*1024*1024)
     339                 :            : #define BUS_AUTH_SIZE_MAX (64*1024)
     340                 :            : /* Note that the D-Bus specification states that bus paths shall have no size limit. We enforce here one
     341                 :            :  * anyway, since truly unbounded strings are a security problem. The limit we pick is relatively large however,
     342                 :            :  * to not clash unnecessarily with real-life applications. */
     343                 :            : #define BUS_PATH_SIZE_MAX (64*1024)
     344                 :            : 
     345                 :            : #define BUS_CONTAINER_DEPTH 128
     346                 :            : 
     347                 :            : /* Defined by the specification as maximum size of an array in bytes */
     348                 :            : #define BUS_ARRAY_MAX_SIZE 67108864
     349                 :            : 
     350                 :            : #define BUS_FDS_MAX 1024
     351                 :            : 
     352                 :            : #define BUS_EXEC_ARGV_MAX 256
     353                 :            : 
     354                 :            : bool interface_name_is_valid(const char *p) _pure_;
     355                 :            : bool service_name_is_valid(const char *p) _pure_;
     356                 :            : bool member_name_is_valid(const char *p) _pure_;
     357                 :            : bool object_path_is_valid(const char *p) _pure_;
     358                 :            : char *object_path_startswith(const char *a, const char *b) _pure_;
     359                 :            : 
     360                 :            : bool namespace_complex_pattern(const char *pattern, const char *value) _pure_;
     361                 :            : bool path_complex_pattern(const char *pattern, const char *value) _pure_;
     362                 :            : 
     363                 :            : bool namespace_simple_pattern(const char *pattern, const char *value) _pure_;
     364                 :            : bool path_simple_pattern(const char *pattern, const char *value) _pure_;
     365                 :            : 
     366                 :            : int bus_message_type_from_string(const char *s, uint8_t *u) _pure_;
     367                 :            : const char *bus_message_type_to_string(uint8_t u) _pure_;
     368                 :            : 
     369                 :            : #define error_name_is_valid interface_name_is_valid
     370                 :            : 
     371                 :            : sd_bus *bus_resolve(sd_bus *bus);
     372                 :            : 
     373                 :            : int bus_ensure_running(sd_bus *bus);
     374                 :            : int bus_start_running(sd_bus *bus);
     375                 :            : int bus_next_address(sd_bus *bus);
     376                 :            : 
     377                 :            : int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m);
     378                 :            : 
     379                 :            : int bus_rqueue_make_room(sd_bus *bus);
     380                 :            : 
     381                 :            : bool bus_pid_changed(sd_bus *bus);
     382                 :            : 
     383                 :            : char *bus_address_escape(const char *v);
     384                 :            : 
     385                 :            : int bus_attach_io_events(sd_bus *b);
     386                 :            : int bus_attach_inotify_event(sd_bus *b);
     387                 :            : 
     388                 :            : void bus_close_inotify_fd(sd_bus *b);
     389                 :            : void bus_close_io_fds(sd_bus *b);
     390                 :            : 
     391                 :            : #define OBJECT_PATH_FOREACH_PREFIX(prefix, path)                        \
     392                 :            :         for (char *_slash = ({ strcpy((prefix), (path)); streq((prefix), "/") ? NULL : strrchr((prefix), '/'); }) ; \
     393                 :            :              _slash && ((_slash[(_slash) == (prefix)] = 0), true);       \
     394                 :            :              _slash = streq((prefix), "/") ? NULL : strrchr((prefix), '/'))
     395                 :            : 
     396                 :            : /* If we are invoking callbacks of a bus object, ensure unreffing the
     397                 :            :  * bus from the callback doesn't destroy the object we are working on */
     398                 :            : #define BUS_DONT_DESTROY(bus) \
     399                 :            :         _cleanup_(sd_bus_unrefp) _unused_ sd_bus *_dont_destroy_##bus = sd_bus_ref(bus)
     400                 :            : 
     401                 :            : int bus_set_address_system(sd_bus *bus);
     402                 :            : int bus_set_address_user(sd_bus *bus);
     403                 :            : int bus_set_address_system_remote(sd_bus *b, const char *host);
     404                 :            : int bus_set_address_system_machine(sd_bus *b, const char *machine);
     405                 :            : 
     406                 :            : int bus_maybe_reply_error(sd_bus_message *m, int r, sd_bus_error *error);
     407                 :            : 
     408                 :            : #define bus_assert_return(expr, r, error)                               \
     409                 :            :         do {                                                            \
     410                 :            :                 if (!assert_log(expr, #expr))                           \
     411                 :            :                         return sd_bus_error_set_errno(error, r);        \
     412                 :            :         } while (false)
     413                 :            : 
     414                 :            : void bus_enter_closing(sd_bus *bus);
     415                 :            : 
     416                 :            : void bus_set_state(sd_bus *bus, enum bus_state state);

Generated by: LCOV version 1.14