From 076e2b73a1ff9ce81474a90065eeb0c5fde99286 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 13 Dec 2015 06:44:06 -0800 Subject: [PATCH] make AABox encoder and decode safer --- libraries/octree/src/OctreePacketData.cpp | 26 ++++++++++++++++------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 1f7c73bb1c..a66ae840c0 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -23,6 +23,11 @@ AtomicUIntStat OctreePacketData::_totalBytesOfValues { 0 }; AtomicUIntStat OctreePacketData::_totalBytesOfPositions { 0 }; AtomicUIntStat OctreePacketData::_totalBytesOfRawData { 0 }; +struct aaCubeData { + glm::vec3 corner; + float scale; +}; + OctreePacketData::OctreePacketData(bool enableCompression, int targetSize) { changeSettings(enableCompression, targetSize); // does reset... } @@ -462,8 +467,15 @@ bool OctreePacketData::appendValue(const QByteArray& bytes) { } bool OctreePacketData::appendValue(const AACube& aaCube) { - bool success = appendValue(aaCube.getCorner()); - return success & appendValue(aaCube.getScale()); + aaCubeData cube { aaCube.getCorner(), aaCube.getScale() }; + const unsigned char* data = (const unsigned char*)&cube; + int length = sizeof(aaCubeData); + bool success = append(data, length); + if (success) { + _bytesOfValues += length; + _totalBytesOfValues += length; + } + return success; } bool OctreePacketData::appendPosition(const glm::vec3& value) { @@ -644,10 +656,8 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, QByteA } int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, AACube& result) { - glm::vec3 corner; - float scale; - int bytes = unpackDataFromBytes(dataBytes, corner); - bytes += unpackDataFromBytes(dataBytes + bytes, scale); - result = AACube(corner, scale); - return bytes; + aaCubeData cube; + memcpy(&cube, dataBytes, sizeof(aaCubeData)); + result = AACube(cube.corner, cube.scale); + return sizeof(aaCubeData); }