From a302872e79e57a6e63e622098726bc3c1e44b915 Mon Sep 17 00:00:00 2001 From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com> Date: Thu, 13 Apr 2023 11:35:04 -0400 Subject: [PATCH] media: fix crash when destroying StreamObserver When StreamObserver is destroyed, observablesFrames_ is removed from the container while iterating over it. This causes undefined behavior and leads to a crash on macOS when the call is finished. GitLab: #827 GitLab: #845 Change-Id: Ifac8ffe7741b8bf32662767a549a5ffb2c580a12 --- src/media/media_recorder.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp index 5731dea951..2f77948fca 100644 --- a/src/media/media_recorder.cpp +++ b/src/media/media_recorder.cpp @@ -71,8 +71,13 @@ struct MediaRecorder::StreamObserver : public Observer<std::shared_ptr<MediaFram ~StreamObserver() { - for (auto& obs : observablesFrames_) { - obs->detach(this); + while (observablesFrames_.size() > 0) { + auto obs = observablesFrames_.begin(); + (*obs)->detach(this); + // it should be erased from observablesFrames_ in detach. If it does not happens erase frame to avoid infinite loop. + auto it = observablesFrames_.find(*obs); + if (it != observablesFrames_.end()) + observablesFrames_.erase(it); } }; -- GitLab