summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2016-04-20 13:18:56 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2016-04-20 13:18:56 -0400
commit0447fe5a57c2b3e0406fd28b665ea9f47d689b2f (patch)
treee8117a3d738c8f5490eb06c7987e3802e35bc5fa
parentb092147a0be579e102c9210c6c99110862e9ad02 (diff)
SL-371 - increased the limit for StackWalker strings, avoid crashing if mesh has wrong number of mAlternateBindMatrix matrices
-rw-r--r--indra/llcommon/StackWalker.h2
-rw-r--r--indra/llprimitive/lldaeloader.cpp4
-rwxr-xr-xindra/newview/llvoavatar.cpp8
3 files changed, 10 insertions, 4 deletions
diff --git a/indra/llcommon/StackWalker.h b/indra/llcommon/StackWalker.h
index 5a5ed96e6f..834f89c471 100644
--- a/indra/llcommon/StackWalker.h
+++ b/indra/llcommon/StackWalker.h
@@ -127,7 +127,7 @@ public:
// in older compilers in order to use it... starting with VC7 we can declare it as "protected"
protected:
#endif
- enum { STACKWALK_MAX_NAMELEN = 2048 }; // max name length for found symbols
+ enum { STACKWALK_MAX_NAMELEN = 4096 }; // max name length for found symbols
protected:
// Entry for each Callstack-Entry
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index df69607404..38b061dd79 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -1189,7 +1189,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
S32 childCount = children.getCount();
//Process any children that are joints
- //Not all children are joints, some code be ambient lights, cameras, geometry etc..
+ //Not all children are joints, some could be ambient lights, cameras, geometry etc..
for (S32 i = 0; i < childCount; ++i)
{
domNode* pNode = daeSafeCast<domNode>(children[i]);
@@ -1229,6 +1229,8 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() );
if ( pJoint )
{
+ // FIXME this has a lot of overlap with processJointNode(), would be nice to refactor.
+
//Pull out the translate id and store it in the jointTranslations map
daeSIDResolver jointResolverA( pJoint, "./translate" );
domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index a82f92b01a..af10af98f2 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5299,9 +5299,13 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)
if ( vobj && vobj->isAttachment() && vobj->isMesh() && pSkinData )
{
const int bindCnt = pSkinData->mAlternateBindMatrix.size();
- if ( bindCnt > 0 )
+ const int jointCnt = pSkinData->mJointNames.size();
+ if ((bindCnt > 0) && (bindCnt != jointCnt))
+ {
+ LL_WARNS_ONCE() << "invalid mesh, bindCnt " << bindCnt << "!= jointCnt " << jointCnt << ", joint overrides will be ignored." << LL_ENDL;
+ }
+ if ((bindCnt > 0) && (bindCnt == jointCnt))
{
- const int jointCnt = pSkinData->mJointNames.size();
const F32 pelvisZOffset = pSkinData->mPelvisOffset;
const LLUUID& mesh_id = pSkinData->mMeshID;
bool fullRig = (jointCnt>=JOINT_COUNT_REQUIRED_FOR_FULLRIG) ? true : false;