diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 7627ee83c5..d5e28abd60 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -7015,23 +7015,44 @@ S32 LLObjectSelection::getNumNodes()
return mList.size();
}
+// Fix for crash while selecting objects with derendered child prims
+bool LLObjectSelection::checkNode(LLSelectNode* nodep)
+{
+ if(nodep)
+ {
+ if(nodep->getObject())
+ {
+ if(!nodep->getObject()->isDead())
+ {
+ return true;
+ }
+ else
+ {
+ LL_WARNS("LLObjectSelection") << "skipping dead node object" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("LLObjectSelection") << "skipping NULL node object pointer" << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("LLObjectSelection") << "skipping NULL node" << LL_ENDL;
+ }
+
+ mFailedNodesList.push_back(nodep);
+ LL_WARNS("AddPointer") << "+++***+++ adding pointer " << (U32) nodep << LL_ENDL;
+ return false;
+}
+ //
+
void LLObjectSelection::addNode(LLSelectNode *nodep)
{
// Fix for crash while selecting objects with derendered child prims
// llassert_always(nodep->getObject() && !nodep->getObject()->isDead());
- if(!nodep)
+ if(!checkNode(nodep))
{
- LL_WARNS("LLObjectSelection") << "skipping NULL node" << LL_ENDL;
- return;
- }
- else if(!nodep->getObject())
- {
- LL_WARNS("LLObjectSelection") << "skipping NULL node object pointer" << LL_ENDL;
- return;
- }
- else if(nodep->getObject()->isDead())
- {
- LL_WARNS("LLObjectSelection") << "skipping dead node object" << LL_ENDL;
return;
}
//
@@ -7044,19 +7065,8 @@ void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep)
{
// Fix for crash while selecting objects with derendered child prims
// llassert_always(nodep->getObject() && !nodep->getObject()->isDead());
- if(!nodep)
+ if(!checkNode(nodep))
{
- LL_WARNS("LLObjectSelection") << "skipping NULL node" << LL_ENDL;
- return;
- }
- else if(!nodep->getObject())
- {
- LL_WARNS("LLObjectSelection") << "skipping NULL node object pointer" << LL_ENDL;
- return;
- }
- else if(nodep->getObject()->isDead())
- {
- LL_WARNS("LLObjectSelection") << "skipping dead node object" << LL_ENDL;
return;
}
//
@@ -7088,6 +7098,11 @@ void LLObjectSelection::deleteAllNodes()
mList.clear();
mSelectNodeMap.clear();
mPrimaryObject = NULL;
+
+ // Fix for crash while selecting objects with derendered child prims
+ std::for_each(mFailedNodesList.begin(),mFailedNodesList.end(),DeletePointer());
+ mFailedNodesList.clear();
+ //
}
LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp)
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index a0dbf100db..417c24dd74 100755
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -380,6 +380,11 @@ private:
LLPointer mPrimaryObject;
std::map, LLSelectNode*> mSelectNodeMap;
ESelectType mSelectType;
+
+ // Fix for crash while selecting objects with derendered child prims
+ list_t mFailedNodesList;
+ bool checkNode(LLSelectNode* nodep);
+ //
};
typedef LLSafeHandle LLObjectSelectionHandle;