Ok, multiple levels of fun in this bug. The first thing to notice is that we're running in a non-main thread (created for processing ORBit requests it looks like?). Inside there we drop into some Evolution code, and then we happen to be the first caller of IA__g_vfs_get_default.
Seems wrong, because that means if dbus_threads_init_default hasn't been called before now, the call to dbus_bus_get_private won't be locked. So this is a possible race condition between a worker thread and a main thread, but may or may not be the cause of the crash. I suspect it's not, but we should fix gvfs anyways.
Now hmmm...assuming gdb hasn't lost its marbles due to gcc optimization,
keys = (DBusList *) 0x19
just looks wrong. However in a quick review of this code I'm not seeing anything obviously wrong, though dbus_parse_address isn't the simplest function in the world.
Ok, multiple levels of fun in this bug. The first thing to notice is that we're running in a non-main thread (created for processing ORBit requests it looks like?). Inside there we drop into some Evolution code, and then we happen to be the first caller of IA__g_vfs_ get_default.
Now...here's an interesting thing to note:
static void get_private (DBUS_BUS_SESSION, NULL); threads_ init_default ();
g_daemon_vfs_init (GDaemonVfs *vfs)
{
...
vfs->async_bus = dbus_bus_
...
if (g_thread_supported ())
dbus_
Seems wrong, because that means if dbus_threads_ init_default hasn't been called before now, the call to dbus_bus_ get_private won't be locked. So this is a possible race condition between a worker thread and a main thread, but may or may not be the cause of the crash. I suspect it's not, but we should fix gvfs anyways.
Now hmmm...assuming gdb hasn't lost its marbles due to gcc optimization,
keys = (DBusList *) 0x19
just looks wrong. However in a quick review of this code I'm not seeing anything obviously wrong, though dbus_parse_address isn't the simplest function in the world.
Anyways I'll submit a patch for gvfs.