From 8e173de3096a8bf79e0fa0aa5c5bd6a696dc20f8 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Wed, 27 Sep 2023 11:53:23 +0200 Subject: SL-20345 Avoid of ASSERT (\!mRootVolp) in LLControlAvatar::~LLControlAvatar() --- indra/newview/llviewerobject.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index f47f0b4572..1a02e9ddd0 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3178,7 +3178,6 @@ void LLViewerObject::unlinkControlAvatar() if (mControlAvatar) { mControlAvatar->markForDeath(); - mControlAvatar->mRootVolp = NULL; mControlAvatar = NULL; } } -- cgit v1.3 From cd32a40195ea5b42084853c56628746fe84095d3 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 29 Sep 2023 00:41:47 +0300 Subject: SL-20366 Crash at setTETextureCore --- indra/newview/llviewerobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1a02e9ddd0..fa21e36f3e 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4933,7 +4933,7 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image) { LLUUID old_image_id = getTE(te)->getID(); - const LLUUID& uuid = image->getID(); + const LLUUID& uuid = image ? image->getID() : LLUUID::null; S32 retval = 0; if (uuid != getTE(te)->getID() || uuid == LLUUID::null) -- cgit v1.3 From 8c1aa6d6623995e56e1cf5de127befcf9033c8ca Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 12 Dec 2023 00:15:29 +0200 Subject: SL-20714 Crash accessing mControlAVBridge Looks like control avatar was recreated after cleanup then object was deleted --- indra/newview/llviewermessage.cpp | 2 +- indra/newview/llviewerobject.cpp | 5 +++++ indra/newview/llvovolume.cpp | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8b6a6807e4..c50365db2a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4229,7 +4229,7 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) LLObjectSignaledAnimationMap::instance().getMap()[uuid] = signaled_anims; LLViewerObject *objp = gObjectList.findObject(uuid); - if (!objp) + if (!objp || objp->isDead()) { LL_DEBUGS("AnimatedObjectsNotify") << "Received animation state for unknown object " << uuid << LL_ENDL; return; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d6443b0bfb..1458570de2 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -391,6 +391,7 @@ LLViewerObject::~LLViewerObject() sNumObjects--; sNumZombieObjects--; llassert(mChildList.size() == 0); + llassert(mControlAvatar.isNull()); // Should have been cleaned by now clearInventoryListeners(); } @@ -3106,6 +3107,10 @@ void LLViewerObject::updateControlAvatar() return; } + // caller isn't supposed to operate on a dead object, + // avatar was already cleaned up + llassert(!isDead()); + bool should_have_control_avatar = false; if (is_animated_object) { diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index ec2f490742..1e212250a3 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5494,6 +5494,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME; llassert(!gCubeSnapshot); + if (group->isDead()) + { + return; + } + if (group->changeLOD()) { group->mLastUpdateDistance = group->mDistance; @@ -5577,7 +5582,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LLVOVolume* vobj = drawablep->getVOVolume(); - if (!vobj) + if (!vobj || vobj->isDead()) { continue; } -- cgit v1.3 From 5e697cc04c0dd876e2484dbe49e32ddd7a711b3d Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 21 Feb 2024 00:31:08 +0200 Subject: SL-20469 Crash at dead mRootVolp in getAttachedAvatar() --- indra/newview/llcontrolavatar.cpp | 6 ++++-- indra/newview/llviewerobject.cpp | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') 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::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(); } -- cgit v1.3