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; } }