From 79a174c793158690dca8954d3deac3dd97376dc4 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 23 Mar 2022 16:21:17 -0400 Subject: [PATCH] HaikuDepot: Fix usage of std::remove. That's right kids, std::remove doesn't (and can't) actually remove things from containers! Instead you have to pass its results into container::erase in order to do anything at all. Fixes #17579, and in my testing at least, the strange crashes and heap corruptions. --- src/apps/haikudepot/edits_generic/EditManager.cpp | 4 +--- src/apps/haikudepot/model/PackageInfo.cpp | 3 ++- src/apps/haikudepot/textview/TextDocument.cpp | 7 ++++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/haikudepot/edits_generic/EditManager.cpp b/src/apps/haikudepot/edits_generic/EditManager.cpp index 3581797c70..3d9790cf5c 100644 --- a/src/apps/haikudepot/edits_generic/EditManager.cpp +++ b/src/apps/haikudepot/edits_generic/EditManager.cpp @@ -174,9 +174,7 @@ EditManager::AddListener(Listener* listener) void EditManager::RemoveListener(Listener* listener) { - fListeners.erase(std::remove( - fListeners.begin(), - fListeners.end(), + fListeners.erase(std::remove(fListeners.begin(), fListeners.end(), listener), fListeners.end()); } diff --git a/src/apps/haikudepot/model/PackageInfo.cpp b/src/apps/haikudepot/model/PackageInfo.cpp index 2040bf0c6a..4af86b94c5 100644 --- a/src/apps/haikudepot/model/PackageInfo.cpp +++ b/src/apps/haikudepot/model/PackageInfo.cpp @@ -1041,7 +1041,8 @@ PackageInfo::AddListener(const PackageInfoListenerRef& listener) void PackageInfo::RemoveListener(const PackageInfoListenerRef& listener) { - std::remove(fListeners.begin(), fListeners.end(), listener); + fListeners.erase(std::remove(fListeners.begin(), fListeners.end(), + listener), fListeners.end()); } diff --git a/src/apps/haikudepot/textview/TextDocument.cpp b/src/apps/haikudepot/textview/TextDocument.cpp index 093868c8e0..815135ecdc 100644 --- a/src/apps/haikudepot/textview/TextDocument.cpp +++ b/src/apps/haikudepot/textview/TextDocument.cpp @@ -141,9 +141,9 @@ TextDocument::Replace(int32 textOffset, int32 length, TextDocumentRef document) { int32 firstParagraph = 0; int32 paragraphCount = 0; - + // TODO: Call _NotifyTextChanging() before any change happened - + status_t ret = _Remove(textOffset, length, firstParagraph, paragraphCount); if (ret != B_OK) return ret; @@ -443,7 +443,8 @@ TextDocument::AddListener(TextListenerRef listener) bool TextDocument::RemoveListener(TextListenerRef listener) { - std::remove(fTextListeners.begin(), fTextListeners.end(), listener); + fTextListeners.erase(std::remove(fTextListeners.begin(), fTextListeners.end(), + listener), fTextListeners.end()); return true; }