Re: Passing FDs to activatable service

Ernestas Kulik <[email protected]>
Newsgroups gmane.comp.freedesktop.dbus
Message-ID <[email protected]>
On Thu, 2019-03-14 at 12:32 +0000, Simon McVittie wrote:
> On Thu, 14 Mar 2019 at 10:08:08 +0100, Ernestas Kulik wrote:
> > All those things work as one would expect, except for one
> > particular
> > case - running reportd as root, letting it activate abrt-dbus and
> > calling SaveElements with a bunch of FDs (it makes sure to not go
> > over
> > 16). abrt-dbus receives the message with the UNIX_FDS header set
> > accordingly, but the actual FDs never seem to arrive.
> 
> D-Bus activation goes on a slightly weird code path: instead of being
> able to deliver the message directly to abrt-dbus in its proper
> sequence,
> the message bus has to start abrt-dbus, and put the message in a data
> structure. When it sees abrt-dbus request its well-known bus name,
> the message bus has to remember that it had a message put aside for
> abrt-dbus, retrieve it and re-attempt delivery. It's possible that
> the
> attached fds get lost somewhere along the way?

Looks like I didn’t mention a couple other things: I don’t see this
issue when doing session (reportd) <-> system (abrt-dbus), and system
<-> system results in dropped FDs even after activation (but, again,
not if I pop a root shell and run abrt-dbus there), so surely it can’t
be hitting the same code path all the time?

> If they do, I would consider that to be bug in whatever message bus
> implementation you're using (usually dbus-daemon, but maybe dbus-
> broker;
> if in doubt ask your OS integrator).

AFAIK, it’s dbus-broker in Fedora, but it happens with both? I tried
disabling one and enabling the other in systemd, so not sure if that
counts as switching between them.

> If it's dbus-daemon, a regression test to dbus that demonstrates this
> bug
> would be very helpful. test/sd-activation.c would probably be the
> best
> starting point. Even if you don't have any particular interest in
> systemd,
> I've found that a mock implementation of systemd activation is easier
> to
> set up in a test than traditional activation, because the test can
> "talk
> to itself" and pretend to be all of: the client, the activatable
> service,
> and systemd.

Thanks for the advice. I tried implementing a dummy service and client,
but I can’t reproduce the issue with those, so I’m going crazy thinking
that something is wrong with either reportd or abrt-dbus, but I can’t
imagine what.

> If you're able to change your D-Bus API, you could maybe work around
> this
> by sending a message without fds to activate abrt-dbus and establish
> an
> object representing a session, then sending the fds by calling
> methods on
> that session object in an abrt-dbus that is already running?
> 
> That would also have the advantage that the message bus doesn't have
> to
> keep those fds held open for a long time (up to 25 seconds by
> default)
> while it waits for abrt-dbus to start.
> 
> > it makes sure to not go over 16
> 
> Because fds have traditionally been a very limited resource (1K, 4K
> or
> 64K per process, and a few tens or hundreds of thousands for the
> entire
> system) and it's difficult to avoid denial-of-service-prone
> situations
> when doing fd-passing through an intermediary like the D-Bus message
> bus, it's possible that we might have to reduce the default for the
> arbitrary limit on fds per message in a future dbus release. If you
> have
> an arbitrary number of fds to send and you are already splitting them
> into arbitrary batches, it would be more conservative to use batches
> of
> size 1, i.e. send each one in a separate message.

That’s what it did originally, but I thought it smart to reduce the
number of round-trips. No problem, though.

> systemd >= 240 raises the hard fd limit by several orders of
> magnitude,
> but not everyone uses systemd, and not everyone who uses systemd has
> this version.
> 
> Regards,
>     smcv

_______________________________________________
dbus mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dbus
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.