1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-06 00:13:33 +00:00

Fix agent crash on ARM64 (Raspberry Pi)

The function ILibWebClient_ProcessWebSocketData in
microstack/ILibWebClient.c reads a 64-bit integer from an address that
is only 2-byte aligned. ARM64 kernels support unaligned accesses from
userspace, but it is not enabled by default and frowned upon - the
required exception handling is ugly and inefficient.

Fix that illegal access in a simple way with a memcpy. More involved and
efficient solutions are also available, such as replacing the byte order
conversion functions with de/serialise functions that take a pointer.

Fixes: https://github.com/Ylianst/MeshAgent/issues/183

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
This commit is contained in:
Phil Elwell
2023-06-05 11:24:45 +01:00
parent ca52306f87
commit 0ba325af84
2 changed files with 6 additions and 6 deletions

View File

@@ -1,5 +1,3 @@
// This file is auto-generated, any edits may be overwritten
#define SOURCE_COMMIT_DATE "2022-Aug-24 00:54:18-0700"
#define SOURCE_COMMIT_DATE "2022-Aug-24 00:54:18-0700"
#define SOURCE_COMMIT_HASH "4d1dc7a08244d71ff2838955797dcf59eddd3fe1"
#define SOURCE_COMMIT_HASH "4d1dc7a08244d71ff2838955797dcf59eddd3fe1"
#define SOURCE_COMMIT_DATE "2023-Apr-14 13:29:41-0700"
#define SOURCE_COMMIT_HASH "ca52306f87407a122fac70723bfa025b9c422ae6"

View File

@@ -1360,7 +1360,9 @@ int ILibWebClient_ProcessWebSocketData(char* buffer, int offset, int length, ILi
}
else
{
unsigned long long v = ILibNTOHLL(((unsigned long long*)(buffer + offset + 2))[0]);
unsigned long long v;
memcpy(&v, buffer + offset + 2, sizeof(v));
v = ILibNTOHLL(v);
if(v > 0x7FFFFFFFUL)
{
// this value is too big to store in a 32 bit signed variable, so disconnect the websocket.