SL-17425 Crash when closing two dependent floaters

dependent_it in llfloater was not valid after dependent floater removed itself from the list
master
Andrey Kleshchev 2022-05-20 00:14:12 +03:00
parent ed74d15246
commit d1265cda36
6 changed files with 13 additions and 18 deletions

View File

@ -276,7 +276,7 @@ void LLAudioEngine::idle(F32 max_decode_time)
{
// The source is done playing, clean it up.
delete sourcep;
mAllSources.erase(iter++);
iter = mAllSources.erase(iter);
continue;
}

View File

@ -138,7 +138,7 @@ void LLStreamingAudio_FMODSTUDIO::killDeadStreams()
{
LL_INFOS("FMOD") << "Closed dead stream" << LL_ENDL;
delete streamp;
mDeadStreams.erase(iter++);
iter = mDeadStreams.erase(iter);
}
else
{

View File

@ -999,7 +999,7 @@ void LLPluginProcessParent::poll(F64 timeout)
while (itClean != sInstances.end())
{
if ((*itClean).second->isDone())
sInstances.erase(itClean++);
itClean = sInstances.erase(itClean);
else
++itClean;
}

View File

@ -761,17 +761,13 @@ void LLFloater::closeFloater(bool app_quitting)
for(handle_set_iter_t dependent_it = mDependents.begin();
dependent_it != mDependents.end(); )
{
LLFloater* floaterp = dependent_it->get();
if (floaterp)
{
++dependent_it;
floaterp->closeFloater(app_quitting);
}
else
{
mDependents.erase(dependent_it++);
}
dependent_it = mDependents.erase(dependent_it);
if (floaterp)
{
floaterp->mDependeeHandle = LLHandle<LLFloater>();
floaterp->closeFloater(app_quitting);
}
}
cleanupHandles();
@ -1439,7 +1435,7 @@ void LLFloater::cleanupHandles()
LLFloater* floaterp = dependent_it->get();
if (!floaterp)
{
mDependents.erase(dependent_it++);
dependent_it = mDependents.erase(dependent_it);
}
else
{

View File

@ -154,8 +154,7 @@ void mark_dead_and_remove_if(T &c, const PredicateMatchRequest &matchPred)
if (matchPred(*it))
{
(*it)->markDead();
// *TDOO: When C++11 is in change the following line to: it = c.erase(it);
c.erase(it++);
it = c.erase(it);
}
else
{

View File

@ -4779,7 +4779,7 @@ void LLVivoxVoiceClient::sessionState::VerifySessions()
if ((*it).expired())
{
LL_WARNS("Voice") << "Expired session found! removing" << LL_ENDL;
mSession.erase(it++);
it = mSession.erase(it);
}
else
++it;
@ -6834,7 +6834,7 @@ void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id)
if (list_iter->second == id)
{
LL_DEBUGS("VoiceFont") << "Removing " << id << " from the voice font list." << LL_ENDL;
mVoiceFontList.erase(list_iter++);
list_iter = mVoiceFontList.erase(list_iter);
mVoiceFontListDirty = true;
}
else