Improve bad object handling and alter default behaviour to derender malformed prims. Debug setting FSEnforceStrictObjectCheck can be disabled to restore weak checks.

(added code to remove object from cache [from Drake], also extended the check to cover other code paths)
meow-7.2.2
Beq 2017-07-18 09:18:03 +01:00
parent 30a7342239
commit 2fb0a11076
2 changed files with 87 additions and 14 deletions

View File

@ -13,16 +13,16 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>FSDebugEnforceStrictObjectCheck</key>
<key>FSEnforceStrictObjectCheck</key>
<map>
<key>Comment</key>
<string>DO NOT USE THIS UNLESS ADVISED - Force malformed prims to be treated as invalid. Can cause crashes.</string>
<string>Force malformed prims to be treated as invalid. This setting derenders all malformed prims, even those that might not cause obvious issues. Setting to false will allow bad prims to render but can cause crashes.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>FSUseV2Friends</key>
<map>

View File

@ -373,7 +373,32 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
// Unpack volume data
LLVolumeParams volume_params;
LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num);
BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, mesgsys, _PREHASH_ObjectData, block_num);
// <FS:Beq> Extend the bogus volume error handling to the other code path
if (!res)
{
//<FS:Beq> Improved bad object handling courtesy of Drake.
std::string region_name = "unknown region";
if (getRegion())
{
region_name = getRegion()->getName();
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL;
getRegion()->addCacheMissFull(getLocalID()); // force cache skip the object
}
}
LL_WARNS() << "Bogus volume parameters in object " << getID() << " @ " << getPositionRegion()
<< " in " << region_name << LL_ENDL;
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
gObjectList.killObject(this);
return (INVALID_UPDATE);
}
// </FS:Beq>
}
volume_params.setSculptID(sculpt_id, sculpt_type);
if (setVolume(volume_params, 0))
@ -389,6 +414,31 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
//
S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num);
if (TEM_INVALID == result)
{
// There's something bogus in the data that we're unpacking.
dp->dumpBufferToLog();
//<FS:Beq> Improved bad object handling courtesy of Drake.
std::string region_name = "unknown region";
if (getRegion())
{
region_name = getRegion()->getName();
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL;
getRegion()->addCacheMissFull(getLocalID()); // force cache skip
}
}
LL_WARNS() << "Bogus TE data in object " << getID() << " @ " << getPositionRegion()
<< " in " << region_name << LL_ENDL;
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
gObjectList.killObject(this);
return (INVALID_UPDATE);
}
// </FS:Beq>
}
if (result & teDirtyBits)
{
updateTEData();
@ -406,9 +456,19 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, *dp);
if (!res)
{
//<FS:Beq> Improved bad object handling courtesy of Drake.
std::string region_name = "unknown region";
if (getRegion())
{
region_name = getRegion()->getName();
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL;
getRegion()->addCacheMissFull(getLocalID()); // force cache skip the object
}
}
LL_WARNS() << "Bogus volume parameters in object " << getID() << " @ " << getPositionRegion()
<< " in " << getRegion()->getName() << LL_ENDL;
LL_WARNS() << getRegion()->getOriginGlobal() << LL_ENDL;
<< " in " << region_name << LL_ENDL;
// <FS:Beq> [FIRE-16995] [CRASH] Continuous crashing upon entering 3 adjacent sims incl. Hathian, D8, Devil's Pocket
// A bad object entry in a .slc simobject cache can result in an unreadable/unusable volume
// This leaves the volume in an uncertain state and can result in a crash when later code access an uninitialised pointer
@ -416,9 +476,10 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
// <FS:Beq> July 2017 Change backed out due to side effects. FIRE-16995 still an exposure.
// return(INVALID_UPDATE);
// NOTE: An option here would be to correctly return the media status using "retval |= INVALID_UPDATE"
if (gSavedSettings.getBOOL("FSDebugEnforceStrictObjectCheck"))
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
retval |= INVALID_UPDATE;
gObjectList.killObject(this);
return (INVALID_UPDATE);
}
// </FS:Beq>
}
@ -434,14 +495,26 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
{
// There's something bogus in the data that we're unpacking.
dp->dumpBufferToLog();
LL_WARNS() << "Flushing cache files" << LL_ENDL;
if(LLVOCache::instanceExists() && getRegion())
//<FS:Beq> Improved bad object handling courtesy of Drake.
std::string region_name = "unknown region";
if (getRegion())
{
LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ;
region_name = getRegion()->getName();
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
LL_WARNS() << "An invalid object (" << getID() << ") has been removed (FSEnforceStrictObjectCheck)" << LL_ENDL;
getRegion()->addCacheMissFull(getLocalID()); // force cache skip
}
}
LL_WARNS() << "Bogus TE data in " << getID() << LL_ENDL;
LL_WARNS() << "Bogus TE data in object " << getID() << " @ " << getPositionRegion()
<< " in " << region_name << LL_ENDL;
if (gSavedSettings.getBOOL("FSEnforceStrictObjectCheck"))
{
gObjectList.killObject(this);
return (INVALID_UPDATE);
}
// </FS:Beq>
}
else
{