[client] lgmp: snapshot session records

This commit is contained in:
Geoffrey McRae
2026-08-24 13:15:12 +10:00
parent 56ea0cfaba
commit 357d5fd3c5

View File

@@ -955,8 +955,9 @@ static bool lgmp_parseSession(struct LG_Transport * this,
return false; return false;
} }
const KVMFR * header = (const KVMFR *)data; KVMFR header;
if (memcmp(header->magic, KVMFR_MAGIC, sizeof(header->magic)) != 0) memcpy(&header, data, sizeof(header));
if (memcmp(header.magic, KVMFR_MAGIC, sizeof(header.magic)) != 0)
{ {
uint32_t current; uint32_t current;
if (lgmp_recoveryVersions(this, NULL, &current) && if (lgmp_recoveryVersions(this, NULL, &current) &&
@@ -965,73 +966,74 @@ static bool lgmp_parseSession(struct LG_Transport * this,
return false; return false;
} }
if (header->version != KVMFR_VERSION) if (header.version != KVMFR_VERSION)
{ {
lgmp_setVersionMismatch(session, "KVMFR", KVMFR_VERSION, lgmp_setVersionMismatch(session, "KVMFR", KVMFR_VERSION,
header->version); header.version);
return false; return false;
} }
str_copy(session->version, sizeof(session->version), header->hostver, str_copy(session->version, sizeof(session->version), header.hostver,
sizeof(header->hostver)); sizeof(header.hostver));
if (header->features & KVMFR_FEATURE_SETCURSORPOS) if (header.features & KVMFR_FEATURE_SETCURSORPOS)
session->features |= LG_TRANSPORT_FEATURE_SET_CURSOR_POS; session->features |= LG_TRANSPORT_FEATURE_SET_CURSOR_POS;
if (header->features & KVMFR_FEATURE_WINDOWSIZE) if (header.features & KVMFR_FEATURE_WINDOWSIZE)
session->features |= LG_TRANSPORT_FEATURE_WINDOW_SIZE; session->features |= LG_TRANSPORT_FEATURE_WINDOW_SIZE;
if (header->features & KVMFR_FEATURE_FRAME_SCHEDULE) if (header.features & KVMFR_FEATURE_FRAME_SCHEDULE)
session->features |= LG_TRANSPORT_FEATURE_FRAME_SCHEDULE; session->features |= LG_TRANSPORT_FEATURE_FRAME_SCHEDULE;
if (header->features & KVMFR_FEATURE_INPUT) if (header.features & KVMFR_FEATURE_INPUT)
session->features |= LG_TRANSPORT_FEATURE_INPUT; session->features |= LG_TRANSPORT_FEATURE_INPUT;
if (header->features & KVMFR_FEATURE_CLIPBOARD) if (header.features & KVMFR_FEATURE_CLIPBOARD)
session->features |= LG_TRANSPORT_FEATURE_CLIPBOARD; session->features |= LG_TRANSPORT_FEATURE_CLIPBOARD;
data += sizeof(header);
data += sizeof(*header); size -= sizeof(header);
size -= sizeof(*header);
while (size >= sizeof(KVMFRRecord)) while (size >= sizeof(KVMFRRecord))
{ {
const KVMFRRecord * record = (const KVMFRRecord *)data; KVMFRRecord record;
data += sizeof(*record); memcpy(&record, data, sizeof(record));
size -= sizeof(*record); const uint32_t recordSize = record.size;
if (record->size > size) data += sizeof(record);
size -= sizeof(record);
if (recordSize > size)
break; break;
switch (record->type) switch (record.type)
{ {
case KVMFR_RECORD_VMINFO: case KVMFR_RECORD_VMINFO:
if (record->size >= sizeof(KVMFRRecord_VMInfo)) if (recordSize >= sizeof(KVMFRRecord_VMInfo))
{ {
const KVMFRRecord_VMInfo * info = KVMFRRecord_VMInfo info;
(const KVMFRRecord_VMInfo *)data; memcpy(&info, data, sizeof(info));
memcpy(session->uuid, info->uuid, sizeof(session->uuid)); memcpy(session->uuid, info.uuid, sizeof(session->uuid));
for (unsigned i = 0; i < sizeof(session->uuid); ++i) for (unsigned i = 0; i < sizeof(session->uuid); ++i)
session->uuidValid |= session->uuid[i] != 0; session->uuidValid |= session->uuid[i] != 0;
str_copy(session->capture, sizeof(session->capture), info->capture, str_copy(session->capture, sizeof(session->capture), info.capture,
sizeof(info->capture)); sizeof(info.capture));
session->cpus = info->cpus; session->cpus = info.cpus;
session->cores = info->cores; session->cores = info.cores;
session->sockets = info->sockets; session->sockets = info.sockets;
const size_t fixed = offsetof(KVMFRRecord_VMInfo, model); const size_t fixed = offsetof(KVMFRRecord_VMInfo, model);
str_copy(session->cpuModel, sizeof(session->cpuModel), info->model, str_copy(session->cpuModel, sizeof(session->cpuModel),
record->size - fixed); (const char *)data + fixed, recordSize - fixed);
} }
break; break;
case KVMFR_RECORD_OSINFO: case KVMFR_RECORD_OSINFO:
if (record->size >= sizeof(KVMFRRecord_OSInfo)) if (recordSize >= sizeof(KVMFRRecord_OSInfo))
{ {
const KVMFRRecord_OSInfo * info = KVMFRRecord_OSInfo info;
(const KVMFRRecord_OSInfo *)data; memcpy(&info, data, sizeof(info));
session->os = info->os <= KVMFR_OS_OTHER ? session->os = info.os <= KVMFR_OS_OTHER ?
(LG_TransportGuestOS)info->os : LG_TRANSPORT_OS_OTHER; (LG_TransportGuestOS)info.os : LG_TRANSPORT_OS_OTHER;
const size_t fixed = offsetof(KVMFRRecord_OSInfo, name); const size_t fixed = offsetof(KVMFRRecord_OSInfo, name);
str_copy(session->osName, sizeof(session->osName), info->name, str_copy(session->osName, sizeof(session->osName),
record->size - fixed); (const char *)data + fixed, recordSize - fixed);
} }
break; break;
} }
data += record->size; data += recordSize;
size -= record->size; size -= recordSize;
} }
return true; return true;