diff --git a/interface/src/avatar/ModelReferential.cpp b/interface/src/avatar/ModelReferential.cpp index 85533603f2..8f1360a705 100644 --- a/interface/src/avatar/ModelReferential.cpp +++ b/interface/src/avatar/ModelReferential.cpp @@ -69,12 +69,12 @@ void ModelReferential::update() { } } -int ModelReferential::packExtraData(unsigned char* destinationBuffer) { +int ModelReferential::packExtraData(unsigned char* destinationBuffer) const { memcpy(destinationBuffer, &_modelID, sizeof(_modelID)); return sizeof(_modelID); } -int ModelReferential::unpackExtraData(const unsigned char *sourceBuffer) { +int ModelReferential::unpackExtraData(const unsigned char *sourceBuffer, int size) { memcpy(&_modelID, sourceBuffer, sizeof(_modelID)); return sizeof(_modelID); } diff --git a/interface/src/avatar/ModelReferential.h b/interface/src/avatar/ModelReferential.h index e87a09594d..806e4edfcb 100644 --- a/interface/src/avatar/ModelReferential.h +++ b/interface/src/avatar/ModelReferential.h @@ -24,8 +24,8 @@ public: virtual void update(); protected: - virtual int packExtraData(unsigned char* destinationBuffer); - virtual int unpackExtraData(const unsigned char* sourceBuffer); + virtual int packExtraData(unsigned char* destinationBuffer) const; + virtual int unpackExtraData(const unsigned char* sourceBuffer, int size); uint32_t _modelID; ModelTree* _tree; diff --git a/libraries/avatars/src/Referential.cpp b/libraries/avatars/src/Referential.cpp index 91c3050e2f..12a0f59186 100644 --- a/libraries/avatars/src/Referential.cpp +++ b/libraries/avatars/src/Referential.cpp @@ -36,7 +36,7 @@ Referential::Referential(const unsigned char*& sourceBuffer, AvatarData* avatar) Referential::~Referential() { } -int Referential::packReferential(unsigned char* destinationBuffer) { +int Referential::packReferential(unsigned char* destinationBuffer) const { const unsigned char* startPosition = destinationBuffer; destinationBuffer += pack(destinationBuffer); @@ -53,17 +53,21 @@ int Referential::unpackReferential(const unsigned char* sourceBuffer) { sourceBuffer += unpack(sourceBuffer); char expectedSize = *sourceBuffer++; - char bytesRead = unpackExtraData(sourceBuffer); + char bytesRead = unpackExtraData(sourceBuffer, expectedSize); _isValid = (bytesRead == expectedSize); + if (!_isValid) { + qDebug() << "[ERROR] Referential extra data overflow"; + } sourceBuffer += expectedSize; return sourceBuffer - startPosition; } -int Referential::pack(unsigned char* destinationBuffer) { +int Referential::pack(unsigned char* destinationBuffer) const { unsigned char* startPosition = destinationBuffer; *destinationBuffer++ = (unsigned char)_type; memcpy(destinationBuffer, &_createdAt, sizeof(_createdAt)); + destinationBuffer += sizeof(_createdAt); destinationBuffer += packFloatVec3ToSignedTwoByteFixed(destinationBuffer, _translation, 0); destinationBuffer += packOrientationQuatToBytes(destinationBuffer, _rotation); @@ -83,13 +87,14 @@ int Referential::unpack(const unsigned char* sourceBuffer) { return sourceBuffer - startPosition; } - -int Referential::unpackExtraData(const unsigned char* sourceBuffer) { - const unsigned char* startPosition = sourceBuffer; - int size = *sourceBuffer; - _extraDataBuffer.clear(); - _extraDataBuffer.setRawData(reinterpret_cast(sourceBuffer), size + 1); - sourceBuffer += size + 1; - return sourceBuffer - startPosition; +int Referential::packExtraData(unsigned char *destinationBuffer) const { + memcpy(destinationBuffer, _extraDataBuffer.data(), _extraDataBuffer.size()); + return _extraDataBuffer.size(); +} + +int Referential::unpackExtraData(const unsigned char* sourceBuffer, int size) { + _extraDataBuffer.clear(); + _extraDataBuffer.setRawData(reinterpret_cast(sourceBuffer), size); + return size; } diff --git a/libraries/avatars/src/Referential.h b/libraries/avatars/src/Referential.h index b7e3a248e8..713b6a028f 100644 --- a/libraries/avatars/src/Referential.h +++ b/libraries/avatars/src/Referential.h @@ -28,24 +28,24 @@ public: Referential(const unsigned char*& sourceBuffer, AvatarData* avatar); virtual ~Referential(); - Type type() { return _type; } - quint64 createdAt() { return _createdAt; } - bool isValid() { return _isValid; } - bool hasExtraData() { return !_extraDataBuffer.isEmpty(); } + Type type() const { return _type; } + quint64 createdAt() const { return _createdAt; } + bool isValid() const { return _isValid; } + bool hasExtraData() const { return !_extraDataBuffer.isEmpty(); } virtual void update() {} - int packReferential(unsigned char* destinationBuffer); + int packReferential(unsigned char* destinationBuffer) const; int unpackReferential(const unsigned char* sourceBuffer); protected: Referential(Type type, AvatarData* avatar); // packs the base class data - int pack(unsigned char* destinationBuffer); + int pack(unsigned char* destinationBuffer) const; int unpack(const unsigned char* sourceBuffer); // virtual functions that pack fthe extra data of subclasses (needs to be reimplemented in subclass) - virtual int packExtraData(unsigned char* destinationBuffer) { return 0; } - virtual int unpackExtraData(const unsigned char* sourceBuffer); + virtual int packExtraData(unsigned char* destinationBuffer) const; + virtual int unpackExtraData(const unsigned char* sourceBuffer, int size); Type _type; quint64 _createdAt;