From 2fb0a110763446206dcb967c105fe84cff33163d Mon Sep 17 00:00:00 2001 From: Beq Date: Tue, 18 Jul 2017 09:18:03 +0100 Subject: [PATCH] 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) --- indra/newview/app_settings/settings.xml | 6 +- indra/newview/llvovolume.cpp | 95 ++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 14 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a1ed987b9f..f3535db51e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -13,16 +13,16 @@ Value 0 - FSDebugEnforceStrictObjectCheck + FSEnforceStrictObjectCheck Comment - DO NOT USE THIS UNLESS ADVISED - Force malformed prims to be treated as invalid. Can cause crashes. + 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. Persist 1 Type Boolean Value - 0 + 1 FSUseV2Friends diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 1f30db9961..cbaf0309fb 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -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); + // Extend the bogus volume error handling to the other code path + if (!res) + { + // 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); + } + // + } + 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(); + // 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); + } + // + } if (result & teDirtyBits) { updateTEData(); @@ -406,9 +456,19 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, BOOL res = LLVolumeMessage::unpackVolumeParams(&volume_params, *dp); if (!res) { + // 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; // [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, // 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); } // } @@ -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()) + // 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); + } + // } else {