From fef3100fd7c9fea0385164cbe494374a2987f268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 May 2024 22:46:10 +0800 Subject: [PATCH] Smbios: add struct layout check --- src/detection/battery/battery_windows.c | 7 ++++--- src/detection/bios/bios_windows.c | 7 +++++-- src/detection/board/board_windows.c | 9 ++++++--- src/detection/chassis/chassis_windows.c | 5 ++++- src/detection/cpu/cpu_windows.c | 5 ++++- src/detection/host/host_windows.c | 7 +++++-- src/util/smbiosHelper.h | 2 +- 7 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/detection/battery/battery_windows.c b/src/detection/battery/battery_windows.c index 357000ec3..72373bceb 100644 --- a/src/detection/battery/battery_windows.c +++ b/src/detection/battery/battery_windows.c @@ -154,8 +154,6 @@ static const char* detectWithSetupApi(FFBatteryOptions* options, FFlist* results return NULL; } - - typedef struct FFSmbiosPortableBattery { FFSmbiosHeader Header; @@ -178,7 +176,10 @@ typedef struct FFSmbiosPortableBattery uint8_t SbdsDeviceChemistry; // string uint8_t DesignCapacityMultiplier; // varies uint16_t OEMSpecific; // varies -} FFSmbiosPortableBattery; +} __attribute__((__packed__)) FFSmbiosPortableBattery; + +static_assert(offsetof(FFSmbiosPortableBattery, OEMSpecific) == 0x16, + "FFSmbiosPortableBattery: Wrong struct alignment"); const char* detectBySmbios(FFBatteryResult* battery) { diff --git a/src/detection/bios/bios_windows.c b/src/detection/bios/bios_windows.c index 23ff25275..1ea9ee97d 100644 --- a/src/detection/bios/bios_windows.c +++ b/src/detection/bios/bios_windows.c @@ -35,7 +35,7 @@ typedef struct FFSmbiosBios uint16_t BiosStartingAddressSegment; // varies uint8_t BiosReleaseDate; // string uint8_t BiosRomSize; // string - uint32_t BiosCharacteristics; // bit field + uint64_t BiosCharacteristics; // bit field // 2.4+ uint8_t BiosCharacteristicsExtensionBytes[2]; // bit field @@ -46,7 +46,10 @@ typedef struct FFSmbiosBios // 3.1+ uint16_t ExtendedBiosRomSize; // bit field -} FFSmbiosBios; +} __attribute__((__packed__)) FFSmbiosBios; + +static_assert(offsetof(FFSmbiosBios, ExtendedBiosRomSize) == 0x18, + "FFSmbiosBios: Wrong struct alignment"); const char* ffDetectBios(FFBiosResult* bios) { diff --git a/src/detection/board/board_windows.c b/src/detection/board/board_windows.c index d16d4a905..78a8ff7d4 100644 --- a/src/detection/board/board_windows.c +++ b/src/detection/board/board_windows.c @@ -14,9 +14,12 @@ typedef struct FFSmbiosBaseboard uint8_t LocationInChassis; // string uint16_t ChassisHandle; // varies uint8_t BoardType; // enum - uint8_t NumberOfContainedObjectHandle; // varies - uint16_t ContainedObjectHandle[]; // varies -} FFSmbiosBaseboard; + uint8_t NumberOfContainedObjectHandles; // varies + uint16_t ContainedObjectHandles[]; // varies +} __attribute__((__packed__)) FFSmbiosBaseboard; + +static_assert(offsetof(FFSmbiosBaseboard, ContainedObjectHandles) == 0x0F, + "FFSmbiosBaseboard: Wrong struct alignment"); const char* ffDetectBoard(FFBoardResult* board) { diff --git a/src/detection/chassis/chassis_windows.c b/src/detection/chassis/chassis_windows.c index 754b85a3d..2075ef20d 100644 --- a/src/detection/chassis/chassis_windows.c +++ b/src/detection/chassis/chassis_windows.c @@ -25,7 +25,10 @@ typedef struct FFSmbiosSystemEnclosure uint8_t ContainedElementCount; // varies uint8_t ContainedRecordLength; // varies uint8_t ContainedElements[]; // varies -} FFSmbiosSystemEnclosure; +} __attribute__((__packed__)) FFSmbiosSystemEnclosure; + +static_assert(offsetof(FFSmbiosSystemEnclosure, ContainedElements) == 0x15, + "FFSmbiosSystemEnclosure: Wrong struct alignment"); const char* ffDetectChassis(FFChassisResult* result) { diff --git a/src/detection/cpu/cpu_windows.c b/src/detection/cpu/cpu_windows.c index 81bae35a1..aad79ce1d 100644 --- a/src/detection/cpu/cpu_windows.c +++ b/src/detection/cpu/cpu_windows.c @@ -48,7 +48,10 @@ typedef struct FFSmbiosProcessorInfo // 3.6+ uint16_t ThreadEnabled; // varies -} FFSmbiosProcessorInfo; +} __attribute__((__packed__)) FFSmbiosProcessorInfo; + +static_assert(offsetof(FFSmbiosProcessorInfo, ThreadEnabled) == 0x30, + "FFSmbiosProcessorInfo: Wrong struct alignment"); #if defined(__x86_64__) || defined(__i386__) diff --git a/src/detection/host/host_windows.c b/src/detection/host/host_windows.c index 8efe70a2f..0470c1210 100644 --- a/src/detection/host/host_windows.c +++ b/src/detection/host/host_windows.c @@ -18,13 +18,16 @@ typedef struct FFSmbiosSystemInfo uint8_t ClockSeqHiAndReserved; uint8_t ClockSeqLow; uint8_t Node[6]; - } UUID; // varies + } __attribute__((__packed__)) UUID; // varies uint8_t WakeUpType; // enum // 2.4+ uint8_t SKUNumber; // string uint8_t Family; // string -} FFSmbiosSystemInfo; +} __attribute__((__packed__)) FFSmbiosSystemInfo; + +static_assert(offsetof(FFSmbiosSystemInfo, Family) == 0x1A, + "FFSmbiosSystemInfo: Wrong struct alignment"); const char* ffDetectHost(FFHostResult* host) { diff --git a/src/util/smbiosHelper.h b/src/util/smbiosHelper.h index 6a80b3ab5..81e820be0 100644 --- a/src/util/smbiosHelper.h +++ b/src/util/smbiosHelper.h @@ -78,7 +78,7 @@ typedef struct FFSmbiosHeader FFSmbiosType Type; uint8_t Length; uint16_t Handle; -} FFSmbiosHeader; +} __attribute__((__packed__)) FFSmbiosHeader; static_assert(sizeof(FFSmbiosHeader) == 4, "FFSmbiosHeader should be 4 bytes"); typedef struct FFRawSmbiosData