@@ -515,7 +515,7 @@ std::vector<std::shared_ptr<Marker>> MarkerBox::PopMarkers(int64_t start_timesta
515515 std::vector<std::shared_ptr<Marker>> markers;
516516 for (auto it = _markers_by_timestamp.begin (); it != _markers_by_timestamp.end ();)
517517 {
518- auto & marker = it->second ;
518+ auto marker = it->second ; // copy shared_ptr to prevent use-after-free after erase
519519 if (marker->GetTimestamp () >= start_timestamp && marker->GetTimestamp () < end_timestamp)
520520 {
521521 markers.push_back (marker);
@@ -538,7 +538,7 @@ std::vector<std::shared_ptr<Marker>> MarkerBox::PopMarkers(int64_t end_timestamp
538538 std::vector<std::shared_ptr<Marker>> markers;
539539 for (auto it = _markers_by_timestamp.begin (); it != _markers_by_timestamp.end ();)
540540 {
541- auto & marker = it->second ;
541+ auto marker = it->second ; // copy shared_ptr to prevent use-after-free after erase
542542 if (marker->GetTimestamp () < end_timestamp)
543543 {
544544 markers.push_back (marker);
@@ -570,8 +570,9 @@ bool MarkerBox::RemoveMarker(int64_t timestamp)
570570 return false ;
571571 }
572572
573+ auto seq_num = it->second ->GetDesiredSequenceNumber (); // save before erase invalidates iterator
573574 _markers_by_timestamp.erase (it);
574- _markers_by_sequence_number.erase (it-> second -> GetDesiredSequenceNumber () );
575+ _markers_by_sequence_number.erase (seq_num );
575576
576577 return true ;
577578}
@@ -582,7 +583,7 @@ void MarkerBox::RemoveExpiredMarkers(int64_t current_timestamp)
582583
583584 for (auto it = _markers_by_timestamp.begin (); it != _markers_by_timestamp.end ();)
584585 {
585- auto & marker = it->second ;
586+ auto marker = it->second ; // copy shared_ptr to prevent use-after-free after erase
586587 if (marker->GetTimestamp () < current_timestamp)
587588 {
588589 logtc (" Remove expired marker:(%" PRId64 " ) %" PRId64 " - %s" , current_timestamp, marker->GetTimestamp (), marker->GetTag ().CStr ());
0 commit comments