diff options
-rw-r--r-- | indra/llappearance/llavatarappearance.cpp | 4 | ||||
-rw-r--r-- | indra/llappearance/llavatarappearance.h | 2 | ||||
-rw-r--r-- | indra/llcharacter/llcharacter.h | 2 | ||||
-rw-r--r-- | indra/llcharacter/llkeyframemotion.cpp | 14 |
4 files changed, 18 insertions, 4 deletions
diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 92217c60ff..38cda2e2f1 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -1348,9 +1348,9 @@ LLVector3 LLAvatarAppearance::getVolumePos(S32 joint_index, LLVector3& volume_of //----------------------------------------------------------------------------- // findCollisionVolume() //----------------------------------------------------------------------------- -LLJoint* LLAvatarAppearance::findCollisionVolume(U32 volume_id) +LLJoint* LLAvatarAppearance::findCollisionVolume(S32 volume_id) { - if ((S32)volume_id > mNumCollisionVolumes) + if ((volume_id < 0) || (volume_id >= mNumCollisionVolumes)) { return NULL; } diff --git a/indra/llappearance/llavatarappearance.h b/indra/llappearance/llavatarappearance.h index 7815c1844b..6a4dbf3726 100644 --- a/indra/llappearance/llavatarappearance.h +++ b/indra/llappearance/llavatarappearance.h @@ -93,7 +93,7 @@ public: /*virtual*/ const char* getAnimationPrefix() { return "avatar"; } /*virtual*/ LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset); - /*virtual*/ LLJoint* findCollisionVolume(U32 volume_id); + /*virtual*/ LLJoint* findCollisionVolume(S32 volume_id); /*virtual*/ S32 getCollisionVolumeID(std::string &name); /*virtual*/ LLPolyMesh* getHeadMesh(); /*virtual*/ LLPolyMesh* getUpperBodyMesh(); diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index 1a3e307663..2fac5f53a6 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -177,7 +177,7 @@ public: virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset) { return LLVector3::zero; } - virtual LLJoint* findCollisionVolume(U32 volume_id) { return NULL; } + virtual LLJoint* findCollisionVolume(S32 volume_id) { return NULL; } virtual S32 getCollisionVolumeID(std::string &name) { return -1; } diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 330d812985..5d323ed5d6 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -1772,6 +1772,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id) bin_data[BIN_DATA_LENGTH] = 0; // Ensure null termination str = (char*)bin_data; constraintp->mSourceConstraintVolume = mCharacter->getCollisionVolumeID(str); + if (constraintp->mSourceConstraintVolume == -1) + { + LL_WARNS() << "not a valid source constraint volume " << str + << " for animation " << asset_id << LL_ENDL; + delete constraintp; + return FALSE; + } if (!dp.unpackVector3(constraintp->mSourceConstraintOffset, "source_offset")) { @@ -1808,6 +1815,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id) { constraintp->mConstraintTargetType = CONSTRAINT_TARGET_TYPE_BODY; constraintp->mTargetConstraintVolume = mCharacter->getCollisionVolumeID(str); + if (constraintp->mTargetConstraintVolume == -1) + { + LL_WARNS() << "not a valid target constraint volume " << str + << " for animation " << asset_id << LL_ENDL; + delete constraintp; + return FALSE; + } } if (!dp.unpackVector3(constraintp->mTargetConstraintOffset, "target_offset")) |