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