diff options
author | Jannis Voelker <jannis.voelker@basyskom.com> | 2018-03-21 12:22:30 +0100 |
---|---|---|
committer | Frank Meerkoetter <frank.meerkoetter@basyskom.com> | 2018-04-05 18:44:35 +0000 |
commit | 59656d562b31b1ff576b43cc40bad5789c80babd (patch) | |
tree | f29d223139d5a0bbef9904889ad6a281ac19635c | |
parent | 2d505d5f5a55c4bdfe316c69986d00cc149d98b9 (diff) |
Fix client lifecycle in the open62541 backend
- Don't leak the client when calling connectToEndpoint more than once.
- Don't segfault when trying to disconnect without a client.
This also removes the memory leaks in the test cases.
Change-Id: I0405a86e9015465b86cc94facac6e8676b4039a7
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Reviewed-by: Frank Meerkoetter <frank.meerkoetter@basyskom.com>
-rw-r--r-- | src/plugins/opcua/open62541/qopen62541backend.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/plugins/opcua/open62541/qopen62541backend.cpp b/src/plugins/opcua/open62541/qopen62541backend.cpp index 24aedf8..ec0eb09 100644 --- a/src/plugins/opcua/open62541/qopen62541backend.cpp +++ b/src/plugins/opcua/open62541/qopen62541backend.cpp @@ -75,6 +75,8 @@ Open62541AsyncBackend::Open62541AsyncBackend(QOpen62541Client *parent) Open62541AsyncBackend::~Open62541AsyncBackend() { qDeleteAll(m_subscriptions); + if (m_uaclient) + UA_Client_delete(m_uaclient); } void Open62541AsyncBackend::readAttributes(uintptr_t handle, UA_NodeId id, QOpcUa::NodeAttributes attr, QString indexRange) @@ -432,6 +434,9 @@ static void clientStateCallback(UA_Client *client, UA_ClientState state) void Open62541AsyncBackend::connectToEndpoint(const QUrl &url) { + if (m_uaclient) + UA_Client_delete(m_uaclient); + UA_ClientConfig conf = UA_ClientConfig_default; conf.clientContext = this; conf.stateCallback = &clientStateCallback; @@ -464,14 +469,16 @@ void Open62541AsyncBackend::disconnectFromEndpoint() m_subscriptions.clear(); m_attributeMapping.clear(); - UA_StatusCode ret = UA_Client_disconnect(m_uaclient); - if (ret != UA_STATUSCODE_GOOD) { - qCWarning(QT_OPCUA_PLUGINS_OPEN62541) << "Open62541: Failed to disconnect"; - // Fall through intentionally + if (m_uaclient) { + UA_StatusCode ret = UA_Client_disconnect(m_uaclient); + if (ret != UA_STATUSCODE_GOOD) { + qCWarning(QT_OPCUA_PLUGINS_OPEN62541) << "Open62541: Failed to disconnect"; + // Fall through intentionally + } + UA_Client_delete(m_uaclient); + m_uaclient = nullptr; } - UA_Client_delete(m_uaclient); - m_uaclient = nullptr; emit stateAndOrErrorChanged(QOpcUaClient::Disconnected, QOpcUaClient::NoError); } |