From 957e4ee54b35198a627c4a52542d25235d9a920b Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Mon, 24 Aug 2026 13:15:42 +1000 Subject: [PATCH] [client] lgmp: validate frame message alignment --- client/tests/lgmp_frame_test.c | 11 +++++++---- client/tests/lgmp_transport_test.c | 3 ++- client/transports/LGMP/lgmp.c | 6 ++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/client/tests/lgmp_frame_test.c b/client/tests/lgmp_frame_test.c index a04fc78f..6a4c65ee 100644 --- a/client/tests/lgmp_frame_test.c +++ b/client/tests/lgmp_frame_test.c @@ -97,11 +97,12 @@ static bool waitForEmpty(TestState * state) return false; } -static bool allocMemory(TestState * state, uint32_t size, +static bool allocMemory(TestState * state, uint32_t size, uint32_t alignment, PLGMPMemory * memory, void ** pointer) { CHECK(state->allocationCount < TEST_MAX_ALLOCS); - CHECK(lgmpHostMemAlloc(state->host, size, memory) == LGMP_OK); + CHECK(lgmpHostMemAllocAligned( + state->host, size, alignment, memory) == LGMP_OK); state->allocations[state->allocationCount++] = *memory; *pointer = lgmpHostMemPtr(*memory); return true; @@ -112,7 +113,8 @@ static bool newFrame(TestState * state, uint32_t serial, TestFrame * result) const uint32_t size = sizeof(KVMFRFrame) + sizeof(FrameBuffer) + TEST_FRAME_DATA; void * pointer; - CHECK(allocMemory(state, size, &result->memory, &pointer)); + CHECK(allocMemory(state, size, _Alignof(KVMFRFrame), + &result->memory, &pointer)); result->wire = pointer; result->wire->formatVer = 1; @@ -199,7 +201,8 @@ static bool testMalformed(TestState * state) PLGMPMemory shortMemory; void * shortPointer; - CHECK(allocMemory(state, sizeof(KVMFRFrame) - 4, &shortMemory, + CHECK(allocMemory(state, sizeof(KVMFRFrame) - 4, _Alignof(uint32_t), + &shortMemory, &shortPointer)); CHECK(lgmpHostQueuePost(state->queues[0], 0, shortMemory) == LGMP_OK); LG_TransportFrame result; diff --git a/client/tests/lgmp_transport_test.c b/client/tests/lgmp_transport_test.c index 0b5ba7c9..b1939a08 100644 --- a/client/tests/lgmp_transport_test.c +++ b/client/tests/lgmp_transport_test.c @@ -381,7 +381,8 @@ int main(void) }; const uint32_t frameSize = sizeof(KVMFRFrame) + sizeof(FrameBuffer) + sizeof(uint32_t); - CHECK(lgmpHostMemAlloc(host, frameSize, &frameMemory) == LGMP_OK); + CHECK(lgmpHostMemAllocAligned(host, frameSize, _Alignof(KVMFRFrame), + &frameMemory) == LGMP_OK); KVMFRFrame * wireFrame = lgmpHostMemPtr(frameMemory); wireFrame->formatVer = 1; wireFrame->frameSerial = 1; diff --git a/client/transports/LGMP/lgmp.c b/client/transports/LGMP/lgmp.c index 02029c5b..aef50b8e 100644 --- a/client/transports/LGMP/lgmp.c +++ b/client/transports/LGMP/lgmp.c @@ -1786,6 +1786,12 @@ static bool lgmp_validateFrameMessage(LG_Transport * this, return false; } + if ((uintptr_t)message->message.mem % _Alignof(KVMFRFrame)) + { + DEBUG_ERROR("LGMP frame payload is not correctly aligned"); + return false; + } + memcpy(&message->lease->snapshot, message->message.mem, sizeof(message->lease->snapshot)); const KVMFRFrame * frame = &message->lease->snapshot;