diff --git a/src/neighbor/plugins/UdisksNeighborPlugin.cxx b/src/neighbor/plugins/UdisksNeighborPlugin.cxx index 359d16ef3..f69901f6a 100644 --- a/src/neighbor/plugins/UdisksNeighborPlugin.cxx +++ b/src/neighbor/plugins/UdisksNeighborPlugin.cxx @@ -113,22 +113,37 @@ UdisksNeighborExplorer::DoOpen() auto &connection = GetConnection(); + /* this ugly try/catch cascade is only here because this + method has no RAII for this method - TODO: improve this */ try { Error error; dbus_bus_add_match(connection, udisks_neighbor_match, error); error.CheckThrow("DBus AddMatch error"); - dbus_connection_add_filter(connection, - HandleMessage, this, - nullptr); + try { + dbus_connection_add_filter(connection, + HandleMessage, this, + nullptr); - auto msg = Message::NewMethodCall(UDISKS2_INTERFACE, - UDISKS2_PATH, - DBUS_OM_INTERFACE, - "GetManagedObjects"); - list_request.Send(connection, *msg.Get(), - std::bind(&UdisksNeighborExplorer::OnListNotify, - this, std::placeholders::_1)); + try { + auto msg = Message::NewMethodCall(UDISKS2_INTERFACE, + UDISKS2_PATH, + DBUS_OM_INTERFACE, + "GetManagedObjects"); + list_request.Send(connection, *msg.Get(), + std::bind(&UdisksNeighborExplorer::OnListNotify, + this, std::placeholders::_1)); + } catch (...) { + dbus_connection_remove_filter(connection, + HandleMessage, + this); + throw; + } + } catch (...) { + dbus_bus_remove_match(connection, + udisks_neighbor_match, nullptr); + throw; + } } catch (...) { dbus_glue.Destruct(); throw;