From becd298e77e01219ba4c1ee67b0bcb87f0c8c347 Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Thu, 22 May 2014 16:17:42 +0200 Subject: [PATCH] FBX: use memcpy() instead of reinterpret_cast or union to populate a float from a blob, causing SIGBUS errors on Android due to memory alignment of the source blob not being a multiple of 4/8. This fixes #24. --- code/FBXParser.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/code/FBXParser.cpp b/code/FBXParser.cpp index fce1143fd..4ea7efb20 100644 --- a/code/FBXParser.cpp +++ b/code/FBXParser.cpp @@ -364,14 +364,24 @@ float ParseTokenAsFloat(const Token& t, const char*& err_out) } if (data[0] == 'F') { - ai_assert(t.end() - data == 5); - // no byte swapping needed for ieee floats - return *reinterpret_cast(data+1); + // Actual size validation happens during Tokenization so + // this is valid as an assertion. + ai_assert(t.end() - data == sizeof(float) + 1); + // Initially, we did reinterpret_cast, breaking strict aliasing rules. + // This actually caused trouble on Android, so let's be safe this time. + // https://github.com/assimp/assimp/issues/24 + + float out_float; + ::memcpy(&out_float, data+1, sizeof(float)); + return out_float; } else { - ai_assert(t.end() - data == 9); - // no byte swapping needed for ieee floats - return static_cast(*reinterpret_cast(data+1)); + ai_assert(t.end() - data == sizeof(double) + 1); + + // Same + double out_double; + ::memcpy(&out_double, data+1, sizeof(double)); + return out_double; } }