From f5c4dcbbf9b4db1a6f06aa00eee69fb0df1eb73c Mon Sep 17 00:00:00 2001 From: John Thacker Date: Fri, 5 May 2023 16:47:33 -0400 Subject: [PATCH] Qt: Fixup Conversations and Endpoints dialog leak fix Fixup !10488. The tap listeners are removed when a file is closed, but the dialogs still need the data until the dialogs are closed. So only reset the data when the dialogs are destroyed (or the taps are reset.) --- ui/qt/models/atap_data_model.cpp | 21 ++++++--------------- ui/qt/models/atap_data_model.h | 1 - 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/ui/qt/models/atap_data_model.cpp b/ui/qt/models/atap_data_model.cpp index 4a4042fc02..017d51dba1 100644 --- a/ui/qt/models/atap_data_model.cpp +++ b/ui/qt/models/atap_data_model.cpp @@ -64,6 +64,11 @@ ATapDataModel::~ATapDataModel() /* Only remove the tap if we come from a enabled model */ if (!_disableTap) remove_tap_listener(hash()); + + if (_type == ATapDataModel::DATAMODEL_ENDPOINT) + reset_endpoint_table_data(&hash_); + else if (_type == ATapDataModel::DATAMODEL_CONVERSATION) + reset_conversation_table_data(&hash_); } int ATapDataModel::protoId() const @@ -107,7 +112,7 @@ bool ATapDataModel::enableTap() /* The errorString is ignored. If this is not working, there is nothing really the user may do about * it, so the error is only interesting to the developer.*/ GString * errorString = register_tap_listener(tap().toUtf8().constData(), hash(), _filter.toUtf8().constData(), - TL_IGNORE_DISPLAY_FILTER, &ATapDataModel::tapReset, conversationPacketHandler(), &ATapDataModel::tapDraw, &ATapDataModel::tapFinish); + TL_IGNORE_DISPLAY_FILTER, &ATapDataModel::tapReset, conversationPacketHandler(), &ATapDataModel::tapDraw, nullptr); if (errorString && errorString->len > 0) { g_string_free(errorString, TRUE); _disableTap = true; @@ -158,20 +163,6 @@ void ATapDataModel::tapDraw(void *tapdata) dataModel->updateData(hash->conv_array); } -void ATapDataModel::tapFinish(void *tapdata) -{ - if (! tapdata) - return; - - conv_hash_t *hash = (conv_hash_t*)tapdata; - ATapDataModel * dataModel = qobject_cast((ATapDataModel *)hash->user_data); - - if (dataModel->modelType() == ATapDataModel::DATAMODEL_ENDPOINT) - reset_endpoint_table_data(hash); - else if (dataModel->modelType() == ATapDataModel::DATAMODEL_CONVERSATION) - reset_conversation_table_data(hash); -} - conv_hash_t * ATapDataModel::hash() { return &hash_; diff --git a/ui/qt/models/atap_data_model.h b/ui/qt/models/atap_data_model.h index 522da49454..38bdbd2fa7 100644 --- a/ui/qt/models/atap_data_model.h +++ b/ui/qt/models/atap_data_model.h @@ -216,7 +216,6 @@ protected: static void tapReset(void *tapdata); static void tapDraw(void *tap_data); - static void tapFinish(void *tapdata); virtual tap_packet_cb conversationPacketHandler();