Merge pull request #359 from Laupetin/fix/load-gltf-base64

fix: loading of base64 data from gltf files
This commit is contained in:
Jan 2025-01-23 22:40:44 +01:00 committed by GitHub
commit 0b91eeb932
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 27 additions and 4 deletions

View File

@ -32,7 +32,8 @@ namespace base64
size_t DecodeBase64(const void* base64Data, const size_t inputLength, void* outputBuffer, const size_t outputBufferSize)
{
unsigned long outLength = GetBase64DecodeOutputLength(inputLength);
unsigned long outLength = GetBase64DecodeOutputLength(base64Data, inputLength);
assert(outLength <= outputBufferSize);
if (outLength > outputBufferSize)
return 0u;
@ -42,8 +43,28 @@ namespace base64
return static_cast<size_t>(outLength);
}
size_t GetBase64DecodeOutputLength(const void* base64Data, const size_t inputLength)
{
assert(base64Data);
assert(inputLength);
if (!base64Data || inputLength == 0u)
return 0u;
auto padding = 0u;
if (inputLength >= 1 && static_cast<const char*>(base64Data)[inputLength - 1] == '=')
{
if (inputLength >= 2 && static_cast<const char*>(base64Data)[inputLength - 2] == '=')
padding = 2u;
else
padding = 1u;
}
return ((inputLength / 4u) * 3u) - padding;
}
size_t GetBase64DecodeOutputLength(const size_t inputLength)
{
return inputLength / 4u;
return (inputLength / 4u) * 3u;
}
} // namespace base64

View File

@ -8,5 +8,6 @@ namespace base64
size_t GetBase64EncodeOutputLength(size_t inputLength);
size_t DecodeBase64(const void* base64Data, size_t inputLength, void* outputBuffer, size_t outputBufferSize);
size_t GetBase64DecodeOutputLength(const void* base64Data, const size_t inputLength);
size_t GetBase64DecodeOutputLength(size_t inputLength);
} // namespace base64

View File

@ -48,11 +48,12 @@ bool DataUriBuffer::ReadDataFromUri(const std::string& uri)
if (!IsDataUri(uri))
return false;
const auto base64Data = &uri[URI_PREFIX_LENGTH];
const auto base64DataLength = uri.size() - URI_PREFIX_LENGTH;
m_data_size = base64::GetBase64DecodeOutputLength(base64DataLength);
m_data_size = base64::GetBase64DecodeOutputLength(base64Data, base64DataLength);
m_data = std::make_unique<uint8_t[]>(m_data_size);
m_data_size = base64::DecodeBase64(&uri[URI_PREFIX_LENGTH], base64DataLength, m_data.get(), m_data_size);
m_data_size = base64::DecodeBase64(base64Data, base64DataLength, m_data.get(), m_data_size);
return m_data_size > 0;
}