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 {