about using privileged (KAuth) helpers: system dbus daemon on OS X?

René J.V. Bertin rjvbertin at gmail.com
Sun Sep 25 09:33:49 UTC 2016


On Saturday September 24 2016 11:08:14 Thiago Macieira wrote:

>> Or am I missing something and is there a reason why a session address has to
>> exist when the client wants to connect to the system bus?
>
>That's the part I was missing.

You too? :)

>How about just setting the default to "launchd:", which means that the address 
>exists, even if it is abstract.

Yes, any address would do as long as it's never used, or leads to a clear error being raised. As far as I've been able to tell that is also the case for a NULL address; there are enough protections in place upstreams from init_connections_unlocked() to prevent NULL pointer dereference.

The current fallback is whatever value DBUS_SESSION_BUS_CONNECT_ADDRESS is set to; on Linux that's "autolaunch:", on Mac that could be set to "launchd:" or "launchd:env=FOO" since that appears to be an existing convention.

What I am missing is how to accomplish this fallback. For an outside, the interplay between init_session_address() (in dbus/dbus-bus.c) and _dbus_lookup_session_address() (in dbus/dbus-sysdeps-unix.c) where the former calls the latter is a complex mess (pardon the term).

Currently, _dbus_lookup_session_address() has 2 completely separate code paths, one for launchd support, and one without. This is also a big part of the reason why Mac users cannot do `eval `dbus-launch`` to start an additional session bus when working from a remote X11 display. I have already verified that it is possible to reenable that particular feature by modifying _dbus_lookup_session_address() (and 2 other functions); I'd have to test whether a version as below would also lead to setting a fallback address in init_connections_unlocked().

What do you think of defining _dbus_lookup_session_address() like this?

dbus_bool_t
_dbus_lookup_session_address (dbus_bool_t *supported,
                              DBusString  *address,
                              DBusError   *error)
{
#ifdef DBUS_ENABLE_LAUNCHD
  *supported = TRUE;
  if (_dbus_lookup_session_address_launchd (address, error))
    {
      // success, no need to attempt anything else
      return TRUE;
    }
// dbus can function without launchd like it does on other Unix versions, even when
// it will use launchd by default (on Mac). So there is no need to disable the
// non-launchd code path below.
#endif
  *supported = FALSE;

  if (!_dbus_lookup_user_bus (supported, address, error))
    return FALSE;
#if defined(DBUS_ENABLE_LAUNCHD) && defined(DBUS_ENABLE_VERBOSE_MODE)
  {
    const char *c = _dbus_string_get_const_data (address);
    _dbus_verbose ("traditional session bus lookup yielded address \"%s\"",
              c ? c : "NULL");
  }
#endif
  if (*supported)
    return TRUE;

  /* On non-Mac Unix platforms, if the session address isn't already
   * set in DBUS_SESSION_BUS_ADDRESS environment variable and the
   * $XDG_RUNTIME_DIR/bus can't be used, we punt and fall back to the
   * autolaunch: global default; see init_session_address in
   * dbus/dbus-bus.c. */
  return TRUE;
}


R.


More information about the dbus mailing list