[patch] do not segfault when D-Bus connection is reused
John (J5) Palmieri
johnp at redhat.com
Thu Aug 24 09:21:10 PDT 2006
Ya, this fix is not quite right. You shouldn't be able to close a
shared connection. We should most likely make close print a warning for
shared connections. Why do we have a close and unref in the first
place?
On Thu, 2006-08-24 at 11:46 -0400, Havoc Pennington wrote:
> Timo Hoenig wrote:
> > On Thu, 2006-08-24 at 11:19 -0400, Havoc Pennington wrote:
> >
> >> Can you explain more what the crash is? This sounds like a memory leak,
> >> not a crash?
> >
> > Actually I don't think it is just a leak. Once the connection is
> > re-established, dbus_pending_call_block() is getting called with pending
> > = 0.
> >
> > The backtraces look like this:
> >
> > #0 0xb7c5fbd7 in dbus_pending_call_get_completed () from /usr/lib/libdbus-1.so.3
> > #1 0xb7c5ffed in dbus_pending_call_block () from /usr/lib/libdbus-1.so.3
> > #2 0xb7c53239 in dbus_connection_send_with_reply_and_block () from /usr/lib/libdbus-1.so.3
> > #3 0xb7c4db18 in dbus_bus_name_has_owner () from /usr/lib/libdbus-1.so.3
> >
> > (I didn't have time to capture a trace with debug info)
> >
>
> Is there an assertion failure message or a segfault - what's the crash?
>
> Definitely need to track down the root cause here.
>
> > If an application calls dbus_connection_close(): Is it supposed to
> > receive the "Disconnected" signal afterwards?
>
> It's guaranteed to receive it, but it's in the message queue, so if you
> never dispatch() it won't be processed. In other words it arrives
> asynchronously.
>
> > At least this does not happen, while debugging I eyed the ref/unref on
> > the connection and the reference of the hard reference was never
> > unref'ed. It would have been unref'ed otherwise as
> > _dbus_bus_check_connection_and_unref() is called upon receiption of
> > "Disconnected".
>
> Of course, there may be a bug...
>
> >> I'm guessing the problem is that dbus_bus_get returns an
> >> already-disconnected connection?
> >
> > Correct.
> >
> > As the ref count for the closed connection is still 1. Thus, the
> > connection is not being finalized properly.
>
> Right, but lack of finalization would be a leak not a crash - so we have
> some problem beyond that i.e. disconnected connections are somehow
> unsafe to use in certain ways.
>
> Hmmm. I was just thinking, I'm not sure dbus_connection_close() on the
> dbus_bus_get() connections is strictly speaking allowed - or perhaps
> should not be allowed - it's very unclear what it means to disconnect a
> shared connection. I'd be interested in why your app is closing these as
> a side question.
>
> > To keep it simple I reduced the code to the test case (cf. my previous
> > mail). No threads are being used.
>
> What I was trying to say is that if it causes problems to return a
> disconnected connection from dbus_bus_get(), then this may not be a
> sufficient fix; because another thread can always disconnect it after
> dbus_bus_get already returned it.
>
> So it's possible we need to fix (or document) things so that getting a
> disconnected bus connection is possible, and be sure it works OK (does
> not crash when following the rules for using shared connections).
>
> Havoc
> _______________________________________________
> dbus mailing list
> dbus at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dbus
--
More information about the dbus
mailing list