From 2fa16719cfa954b9a77dbd3776681cab966a2d33 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 10 Jun 2019 16:52:44 -0700 Subject: [PATCH 1/4] AvatarData: Fix avatarDataByteArray max size computation The previous size calculation did not take the presence of the hand controller section into account. This could sometimes result in a buffer overrun of the network buffer as identified in a debug build. https://highfidelity.atlassian.net/browse/BUGZ-526 --- libraries/avatars/src/AvatarData.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index e5131ff94b..8e2eb7bf8e 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -302,6 +302,15 @@ namespace AvatarDataPacket { const size_t AVATAR_LOCAL_POSITION_SIZE = 12; static_assert(sizeof(AvatarLocalPosition) == AVATAR_LOCAL_POSITION_SIZE, "AvatarDataPacket::AvatarLocalPosition size doesn't match."); + PACKED_BEGIN struct HandControllers { + SixByteQuat leftHandRotation; + SixByteTrans leftHandTranslation; + SixByteQuat rightHandRotation; + SixByteTrans rightHandTranslation; + } PACKED_END; + static const size_t HAND_CONTROLLERS_SIZE = 24; + static_assert(sizeof(HandControllers) == HAND_CONTROLLERS_SIZE, "AvatarDataPacket::HandControllers size doesn't match."); + const size_t MAX_CONSTANT_HEADER_SIZE = HEADER_SIZE + AVATAR_GLOBAL_POSITION_SIZE + AVATAR_BOUNDING_BOX_SIZE + @@ -312,17 +321,8 @@ namespace AvatarDataPacket { SENSOR_TO_WORLD_SIZE + ADDITIONAL_FLAGS_SIZE + PARENT_INFO_SIZE + - AVATAR_LOCAL_POSITION_SIZE; - - PACKED_BEGIN struct HandControllers { - SixByteQuat leftHandRotation; - SixByteTrans leftHandTranslation; - SixByteQuat rightHandRotation; - SixByteTrans rightHandTranslation; - } PACKED_END; - static const size_t HAND_CONTROLLERS_SIZE = 24; - static_assert(sizeof(HandControllers) == HAND_CONTROLLERS_SIZE, "AvatarDataPacket::HandControllers size doesn't match."); - + AVATAR_LOCAL_POSITION_SIZE + + HAND_CONTROLLERS_SIZE; // variable length structure follows From 889a5d2bda8772eb06c33549b52a0fc2595b57c9 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 10 Jun 2019 17:58:46 -0700 Subject: [PATCH 2/4] AvatarData: Add FAR_GRAB_JOINTS_SIZE to byteArraySize computation. --- libraries/avatars/src/AvatarData.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 942b13c237..eb12fd83a8 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -398,6 +398,7 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent const size_t byteArraySize = AvatarDataPacket::MAX_CONSTANT_HEADER_SIZE + NUM_BYTES_RFC4122_UUID + AvatarDataPacket::maxFaceTrackerInfoSize(_headData->getBlendshapeCoefficients().size()) + AvatarDataPacket::maxJointDataSize(_jointData.size()) + + FAR_GRAB_JOINTS_SIZE + AvatarDataPacket::maxJointDefaultPoseFlagsSize(_jointData.size()); if (maxDataSize == 0) { From 6c4e7cd805f1311d80cbbcd8fd041ff300286170 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 10 Jun 2019 18:00:54 -0700 Subject: [PATCH 3/4] AvatarData: arranged order of size computation reflect order in the packet. --- libraries/avatars/src/AvatarData.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index eb12fd83a8..7f25dcf8fb 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -396,10 +396,10 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent } const size_t byteArraySize = AvatarDataPacket::MAX_CONSTANT_HEADER_SIZE + NUM_BYTES_RFC4122_UUID + - AvatarDataPacket::maxFaceTrackerInfoSize(_headData->getBlendshapeCoefficients().size()) + - AvatarDataPacket::maxJointDataSize(_jointData.size()) + - FAR_GRAB_JOINTS_SIZE + - AvatarDataPacket::maxJointDefaultPoseFlagsSize(_jointData.size()); + AvatarDataPacket::maxFaceTrackerInfoSize(_headData->getBlendshapeCoefficients().size()) + + AvatarDataPacket::maxJointDataSize(_jointData.size()) + + AvatarDataPacket::maxJointDefaultPoseFlagsSize(_jointData.size()) + + FAR_GRAB_JOINTS_SIZE; if (maxDataSize == 0) { maxDataSize = (int)byteArraySize; From 897e276188ef32ef33779c8a1173abc5ad11c9ff Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 10 Jun 2019 18:34:11 -0700 Subject: [PATCH 4/4] Compile fix --- libraries/avatars/src/AvatarData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 7f25dcf8fb..a2dde3d651 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -399,7 +399,7 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent AvatarDataPacket::maxFaceTrackerInfoSize(_headData->getBlendshapeCoefficients().size()) + AvatarDataPacket::maxJointDataSize(_jointData.size()) + AvatarDataPacket::maxJointDefaultPoseFlagsSize(_jointData.size()) + - FAR_GRAB_JOINTS_SIZE; + AvatarDataPacket::FAR_GRAB_JOINTS_SIZE; if (maxDataSize == 0) { maxDataSize = (int)byteArraySize;