Skip to content

Commit

Permalink
Fix startup crash on arm.
Browse files Browse the repository at this point in the history
  • Loading branch information
ratkosrb committed Jul 11, 2024
1 parent 1f65583 commit 3d61a81
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/shared/ByteBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
30 changes: 30 additions & 0 deletions src/shared/Database/SQLStorageImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@ template<class DerivedLoader, class StorageClass>
template<class S, class D> // S source-type, D destination-type
void SQLStorageLoaderBase<DerivedLoader, StorageClass>::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);
}

Expand Down Expand Up @@ -66,6 +76,16 @@ template<class DerivedLoader, class StorageClass>
template<class D> // D destination-type
void SQLStorageLoaderBase<DerivedLoader, StorageClass>::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;
}

Expand All @@ -79,6 +99,16 @@ template<class DerivedLoader, class StorageClass>
template<class S, class D> // S source-type, D destination-type
void SQLStorageLoaderBase<DerivedLoader, StorageClass>::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);
}

Expand Down

0 comments on commit 3d61a81

Please sign in to comment.