diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 9a67dbf66..618a973bb 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -1038,21 +1038,27 @@ size_t Accessor::ExtractData(T *&outData, const std::vector *remap const size_t maxSize = GetMaxByteSize(); + if (elemSize > maxSize) { + throw DeadlyImportError("GLTF: elemSize ", elemSize, " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); + } + + const size_t maxCount = (maxSize - elemSize) / stride + 1; + + if (count > maxCount) { + throw DeadlyImportError("GLTF: count ", count, " > maxCount ", maxCount, " in ", getContextForErrorMessages(id, name)); + } + outData = new T[usedCount]; if (remappingIndices != nullptr) { - const unsigned int maxIndexCount = static_cast(maxSize / stride); for (size_t i = 0; i < usedCount; ++i) { size_t srcIdx = (*remappingIndices)[i]; - if (srcIdx >= maxIndexCount) { - throw DeadlyImportError("GLTF: index*stride ", (srcIdx * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); + if (srcIdx >= count) { + throw DeadlyImportError("GLTF: index ", srcIdx, " >= count ", count, " in ", getContextForErrorMessages(id, name)); } memcpy(outData + i, data + srcIdx * stride, elemSize); } } else { // non-indexed cases - if (usedCount * stride > maxSize) { - throw DeadlyImportError("GLTF: count*stride ", (usedCount * stride), " > maxSize ", maxSize, " in ", getContextForErrorMessages(id, name)); - } if (stride == elemSize && targetElemSize == elemSize) { memcpy(outData, data, totalSize); } else {