Skip to content

Commit 2f2943a

Browse files
committed
fix: prevent use-after-free in MarkerBox
1 parent 7a4e59b commit 2f2943a

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

src/projects/base/modules/marker/marker_box.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)