Fix for invalid signal deregistration 30/154030/1
authorRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Thu, 5 Oct 2017 09:58:19 +0000 (11:58 +0200)
committerRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Thu, 5 Oct 2017 09:58:19 +0000 (11:58 +0200)
Add signal hanlder unregister call, when pointer to callback function
is being destroyed.

Change-Id: I379f988a2589bd06fc95297a3ed6df32deefdc3b

src/DBus.hpp
tests/no-ui-scenarios/DBusTests.cpp

index 954f62c..6c7b727 100644 (file)
@@ -1110,8 +1110,9 @@ namespace DBus
                                        detail::apply(callback, params.getValues());
                                }
                        };
-                       eldbus_proxy_signal_handler_add(connectionState.proxy, signalName.c_str(), listenerCallback, tmp);
+                       auto handler = eldbus_proxy_signal_handler_add(connectionState.proxy, signalName.c_str(), listenerCallback, tmp);
                        destructors.push_back([ = ]() {
+                               eldbus_signal_handler_del(handler);
                                delete tmp;
                        });
                }
index 7cc02e9..09c6b43 100644 (file)
@@ -539,7 +539,14 @@ TEST_F(DBusTest, synchronousCall)
        auto r = db.method<int(int, int)>("add").call(10, 55);
        ASSERT_TRUE(r);
        ASSERT_EQ(std::get<0>(r), 10 + 55);
-       r = db.method<int(int, int)>("add").call(-10, 55);
+}
+
+// Calls method on external process synchronously, expect error
+TEST_F(DBusTest, synchronousCallExpectError)
+{
+       auto connection = DBus::getDBusConnectionByType(DBus::ConnectionType::SYSTEM);
+       DBus::DBusClient db{testBusName, syncPathName, syncInterfaceName, connection};
+       auto r = db.method<int(int, int)>("add").call(-10, 55);
        ASSERT_FALSE(r);
        ASSERT_EQ(r.getError().message, "org.freedesktop.DBus.Error.Failed: negative");
 }