summaryrefslogtreecommitdiff
path: root/indra/newview/llteleporthistory.cpp
diff options
context:
space:
mode:
authorVadim Savchuk <vsavchuk@productengine.com>2010-04-23 17:18:37 +0300
committerVadim Savchuk <vsavchuk@productengine.com>2010-04-23 17:18:37 +0300
commit07b463722e3e87aaea608981a1020f1b482781ba (patch)
treeec0381c5bfd491b5e71977aba29b5c7ccc275db0 /indra/newview/llteleporthistory.cpp
parent1186e6dd74c7e828eacb93959b57f5ee074741a4 (diff)
Fixed bug EXT-6798 (Crash in LLTeleportHistoryStorage).
Reason: Attempt to purge empty teleport history resulted in inconsistent history state. There were two consequences: 1) Further teleports would not properly update the history. 2) Subscribers of history changes were notified of the invalid change and that led to the crash. My changes: - added a sanity check to LLTeleportHistoryStorage::onTeleportHistoryChange() to prevent the crash - purging empty teleport history now does nothing, hence the history doesn't become inconsistent - removed a redundant (but harmless) call to onTeleportHistoryChanged() from LLNavigationBar::draw() because it's called by LLTeleportHistory::purgeItems() anyway Reviewed by Mike at https://codereview.productengine.com/secondlife/r/304/ --HG-- branch : product-engine
Diffstat (limited to 'indra/newview/llteleporthistory.cpp')
-rw-r--r--indra/newview/llteleporthistory.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index dcc85392f7..15684337f4 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -136,6 +136,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check
{
llwarns << "Invalid current item. (this should not happen)" << llendl;
+ llassert(!"Invalid current teleport histiry item");
return;
}
LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
@@ -166,6 +167,17 @@ void LLTeleportHistory::onHistoryChanged()
void LLTeleportHistory::purgeItems()
{
+ if (mItems.size() == 0) // no entries yet (we're called before login)
+ {
+ // If we don't return here the history will get into inconsistent state, hence:
+ // 1) updateCurrentLocation() will malfunction,
+ // so further teleports will not properly update the history;
+ // 2) mHistoryChangedSignal subscribers will be notified
+ // of such an invalid change. (EXT-6798)
+ // Both should not happen.
+ return;
+ }
+
if (mItems.size() > 0)
{
mItems.erase(mItems.begin(), mItems.end()-1);