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.
parent
e0aafb5733
commit
becd298e77
|
@ -364,14 +364,24 @@ float ParseTokenAsFloat(const Token& t, const char*& err_out)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data[0] == 'F') {
|
if (data[0] == 'F') {
|
||||||
ai_assert(t.end() - data == 5);
|
// Actual size validation happens during Tokenization so
|
||||||
// no byte swapping needed for ieee floats
|
// this is valid as an assertion.
|
||||||
return *reinterpret_cast<const float*>(data+1);
|
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 {
|
else {
|
||||||
ai_assert(t.end() - data == 9);
|
ai_assert(t.end() - data == sizeof(double) + 1);
|
||||||
// no byte swapping needed for ieee floats
|
|
||||||
return static_cast<float>(*reinterpret_cast<const double*>(data+1));
|
// Same
|
||||||
|
double out_double;
|
||||||
|
::memcpy(&out_double, data+1, sizeof(double));
|
||||||
|
return out_double;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue