diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h index 03e7b3cfd6b..8036e95d1ec 100644 --- a/src/shared/ByteBuffer.h +++ b/src/shared/ByteBuffer.h @@ -333,7 +333,15 @@ class ByteBuffer { if(pos + sizeof(T) > size()) throw ByteBufferException(false, pos, sizeof(T), size()); + +#if defined(__arm__) || defined(_M_ARM) + // memcpy to avoid alignment issues + T val; + memcpy((void*)&val, (void*)&_storage[pos], sizeof(T)); +#else T val = *((T const*)&_storage[pos]); +#endif + EndianConvert(val); return val; } diff --git a/src/shared/Database/SQLStorageImpl.h b/src/shared/Database/SQLStorageImpl.h index c4c058dd140..d5b29b7490d 100644 --- a/src/shared/Database/SQLStorageImpl.h +++ b/src/shared/Database/SQLStorageImpl.h @@ -27,6 +27,16 @@ template template // S source-type, D destination-type void SQLStorageLoaderBase::convert(uint32 /*field_pos*/, S src, D& dst) { +#if defined(__arm__) || defined(_M_ARM) + if (((unsigned)&dst) % sizeof(D)) + { + // address not aligned. Use memcpy to avoid unaligned trap + D converted(src); + memcpy((void*)&dst, (void*)&converted, sizeof(D)); + + } + else +#endif dst = D(src); } @@ -66,6 +76,16 @@ template template // D destination-type void SQLStorageLoaderBase::convert_from_str(uint32 /*field_pos*/, char const* /*src*/, D& dst) { +#if defined(__arm__) || defined(_M_ARM) + if (((unsigned)&dst) % sizeof(D)) + { + // address not aligned. Use memcpy to avoid unaligned trap + D converted(0); + memcpy((void*)&dst, (void*)&converted, sizeof(D)); + + } + else +#endif dst = 0; } @@ -79,6 +99,16 @@ template template // S source-type, D destination-type void SQLStorageLoaderBase::default_fill(uint32 /*field_pos*/, S src, D& dst) { +#if defined(__arm__) || defined(_M_ARM) + if (((unsigned)&dst) % sizeof(D)) + { + // address not aligned. Use memcpy to avoid unaligned trap + D converted(src); + memcpy((void*)&dst, (void*)&converted, sizeof(D)); + + } + else +#endif dst = D(src); }