summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-02-21 00:31:08 +0200
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2024-02-21 05:23:36 +0200
commit5e697cc04c0dd876e2484dbe49e32ddd7a711b3d (patch)
tree51d72868eef866fbb49aa505ad1efa660f5749ec
parent54dfcd7502a0f4cc6d14ac5fec026dcc9c498eaa (diff)
SL-20469 Crash at dead mRootVolp in getAttachedAvatar()
-rw-r--r--indra/newview/llcontrolavatar.cpp6
-rw-r--r--indra/newview/llviewerobject.cpp6
2 files changed, 10 insertions, 2 deletions
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 50b9af668b..d764f64c79 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -99,7 +99,6 @@ LLVOAvatar *LLControlAvatar::getAttachedAvatar()
void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_scale_fixup) const
{
-
F32 max_legal_offset = MAX_LEGAL_OFFSET;
if (gSavedSettings.getControl("AnimatedObjectsMaxLegalOffset"))
{
@@ -362,6 +361,9 @@ LLControlAvatar *LLControlAvatar::createControlAvatar(LLVOVolume *obj)
void LLControlAvatar::markForDeath()
{
mMarkedForDeath = true;
+ // object unlinked cav and might be dead already
+ // might need to clean mControlAVBridge here as well
+ mRootVolp = NULL;
}
void LLControlAvatar::idleUpdate(LLAgent &agent, const F64 &time)
@@ -440,7 +442,7 @@ void LLControlAvatar::updateDebugText()
F32 streaming_cost = 0.f;
std::string cam_dist_string = "";
S32 cam_dist_count = 0;
- F32 lod_radius = mRootVolp->mLODRadius;
+ F32 lod_radius = mRootVolp ? mRootVolp->mLODRadius : 0.f;
for (std::vector<LLVOVolume*>::iterator it = volumes.begin();
it != volumes.end(); ++it)
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index d46339e2fd..fc055a7303 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -392,6 +392,12 @@ LLViewerObject::~LLViewerObject()
sNumZombieObjects--;
llassert(mChildList.size() == 0);
llassert(mControlAvatar.isNull()); // Should have been cleaned by now
+ if (mControlAvatar.notNull())
+ {
+ mControlAvatar->markForDeath();
+ mControlAvatar = NULL;
+ LL_WARNS() << "Dead object owned a live control avatar" << LL_ENDL;
+ }
clearInventoryListeners();
}