From 967b30de3a860ba86453d78cdaecd6ed0c38c46a Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Mon, 12 Dec 2022 23:38:36 -0800 Subject: [PATCH] [glass] Fix NT view UpdateClients() bug (#4808) If UpdateClients() was called in the same update batch as an entry removal, it could crash in GetEntry() due to a null entry caused by deletion before a removal erase pass was made. --- glass/src/libnt/native/cpp/NetworkTables.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/glass/src/libnt/native/cpp/NetworkTables.cpp b/glass/src/libnt/native/cpp/NetworkTables.cpp index 226e347201..90bc306aaf 100644 --- a/glass/src/libnt/native/cpp/NetworkTables.cpp +++ b/glass/src/libnt/native/cpp/NetworkTables.cpp @@ -478,6 +478,10 @@ void NetworkTablesModel::Update() { entry->info.type_str == "msgpack") { // meta topic handling if (entry->info.name == "$clients") { + // need to remove deleted entries as UpdateClients() uses GetEntry() + if (updateTree) { + std::erase(m_sortedEntries, nullptr); + } UpdateClients(entry->value.GetRaw()); } else if (entry->info.name == "$serverpub") { m_server.UpdatePublishers(entry->value.GetRaw()); @@ -505,9 +509,7 @@ void NetworkTablesModel::Update() { } // remove deleted entries - m_sortedEntries.erase( - std::remove(m_sortedEntries.begin(), m_sortedEntries.end(), nullptr), - m_sortedEntries.end()); + std::erase(m_sortedEntries, nullptr); RebuildTree(); }