#3413 Crash at removeFromLocalIDTable #2

Don't rely onto region for cleanup
meow-7.2.2
Andrey Kleshchev 2025-01-17 17:57:03 +02:00 committed by Andrey Kleshchev
parent b1bd083728
commit 306e9e6d02
3 changed files with 26 additions and 24 deletions

View File

@ -727,6 +727,9 @@ public:
// index into LLViewerObjectList::mActiveObjects or -1 if not in list
S32 mListIndex;
// last index data for mIndexAndLocalIDToUUID
U32 mRegionIndex;
LLPointer<LLViewerTexture> *mTEImages;
LLPointer<LLViewerTexture> *mTENormalMaps;
LLPointer<LLViewerTexture> *mTESpecularMaps;

View File

@ -164,21 +164,14 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
return (((U64)index) << 32) | (U64)local_id;
}
bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
bool LLViewerObjectList::removeFromLocalIDTable(LLViewerObject* objectp)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if(objectp && objectp->getRegion())
if(objectp && objectp->mRegionIndex != 0)
{
U32 local_id = objectp->mLocalID;
U32 ip = objectp->getRegion()->getHost().getAddress();
U32 port = objectp->getRegion()->getHost().getPort();
U64 ipport = (((U64)ip) << 32) | (U64)port;
U32 index = mIPAndPortToIndex[ipport];
// LL_INFOS() << "Removing object from table, local ID " << local_id << ", ip " << ip << ":" << port << LL_ENDL;
U64 indexid = (((U64)index) << 32) | (U64)local_id;
U64 indexid = (((U64)objectp->mRegionIndex) << 32) | (U64)local_id;
std::map<U64, LLUUID>::iterator iter = mIndexAndLocalIDToUUID.find(indexid);
if (iter == mIndexAndLocalIDToUUID.end())
@ -190,6 +183,7 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
if (iter->second == objectp->getID())
{ // Full UUIDs match, so remove the entry
mIndexAndLocalIDToUUID.erase(iter);
objectp->mRegionIndex = 0;
return true;
}
// UUIDs did not match - this would zap a valid entry, so don't erase it
@ -203,7 +197,8 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
const U32 local_id,
const U32 ip,
const U32 port)
const U32 port,
LLViewerObject* objectp)
{
U64 ipport = (((U64)ip) << 32) | (U64)port;
@ -215,6 +210,7 @@ void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,
mIPAndPortToIndex[ipport] = index;
}
objectp->mRegionIndex = index; // should never be zero, sSimulatorMachineIndex starts from 1
U64 indexid = (((U64)index) << 32) | (U64)local_id;
mIndexAndLocalIDToUUID[indexid] = id;
@ -335,7 +331,8 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry*
removeFromLocalIDTable(objectp);
setUUIDAndLocal(fullid, entry->getLocalID(),
regionp->getHost().getAddress(),
regionp->getHost().getPort());
regionp->getHost().getPort(),
objectp);
if (objectp->mLocalID != entry->getLocalID())
{ // Update local ID in object with the one sent from the region
@ -582,7 +579,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
setUUIDAndLocal(fullid,
local_id,
gMessageSystem->getSenderIP(),
gMessageSystem->getSenderPort());
gMessageSystem->getSenderPort(),
objectp);
if (objectp->mLocalID != local_id)
{ // Update local ID in object with the one sent from the region
@ -1309,10 +1307,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
// << objectp->getRegion()->getHost().getPort() << LL_ENDL;
//}
if (!mIndexAndLocalIDToUUID.empty())
{
removeFromLocalIDTable(objectp);
}
removeFromLocalIDTable(objectp);
if (objectp->onActiveList())
{
@ -1396,6 +1391,7 @@ void LLViewerObjectList::killAllObjects()
objectp = *iter;
objectp->setOnActiveList(false);
objectp->setListIndex(-1);
objectp->mRegionIndex = 0;
objectp->mOnMap = false;
killObject(objectp);
// Object must be dead, or it's the LLVOAvatarSelf which never dies.
@ -1508,9 +1504,9 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
mActiveObjects.push_back(objectp);
objectp->setListIndex(static_cast<S32>(mActiveObjects.size()) - 1);
objectp->setOnActiveList(true);
}
else
{
}
else
{
llassert(idx < mActiveObjects.size());
llassert(mActiveObjects[idx] == objectp);
@ -1862,7 +1858,8 @@ LLViewerObject *LLViewerObjectList::createObjectFromCache(const LLPCode pcode, L
setUUIDAndLocal(uuid,
local_id,
regionp->getHost().getAddress(),
regionp->getHost().getPort());
regionp->getHost().getPort(),
objectp);
mObjects.push_back(objectp);
updateActive(objectp);
@ -1900,7 +1897,8 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe
setUUIDAndLocal(fullid,
local_id,
gMessageSystem->getSenderIP(),
gMessageSystem->getSenderPort());
gMessageSystem->getSenderPort(),
objectp);
mObjects.push_back(objectp);

View File

@ -179,9 +179,10 @@ public:
void setUUIDAndLocal(const LLUUID &id,
const U32 local_id,
const U32 ip,
const U32 port); // Requires knowledge of message system info!
const U32 port,
LLViewerObject* objectp); // Requires knowledge of message system info!
bool removeFromLocalIDTable(const LLViewerObject* objectp);
bool removeFromLocalIDTable(LLViewerObject* objectp);
// Used ONLY by the orphaned object code.
U64 getIndex(const U32 local_id, const U32 ip, const U32 port);