[prev in list] [next in list] [prev in thread] [next in thread]
List: fwts-devel
Subject: [PATCH] acpi: refactor all table length checks to fwts_acpi_table_length_check
From: Alex Hung <alex.hung () canonical ! com>
Date: 2019-02-26 19:03:53
Message-ID: 20190226190353.29476-1-alex.hung () canonical ! com
[Download RAW message or body]
Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
src/acpi/aspt/aspt.c | 7 +------
src/acpi/boot/boot.c | 7 +------
src/acpi/dbg2/dbg2.c | 7 +------
src/acpi/dbgp/dbgp.c | 7 +------
src/acpi/fpdt/fpdt.c | 8 +-------
src/acpi/hest/hest.c | 8 +-------
src/acpi/mchi/mchi.c | 7 +------
src/acpi/msdm/msdm.c | 7 +------
src/acpi/slic/slic.c | 7 +------
src/acpi/slit/slit.c | 7 +------
src/acpi/spmi/spmi.c | 7 +------
src/acpi/uefi/uefi.c | 7 +------
src/acpi/waet/waet.c | 7 +------
src/lib/include/fwts_acpi_tables.h | 1 +
src/lib/src/fwts_acpi_tables.c | 23 +++++++++++++++++++++++
15 files changed, 37 insertions(+), 80 deletions(-)
diff --git a/src/acpi/aspt/aspt.c b/src/acpi/aspt/aspt.c
index a2a438b1..7e64e06a 100644
--- a/src/acpi/aspt/aspt.c
+++ b/src/acpi/aspt/aspt.c
@@ -52,13 +52,8 @@ static int aspt_test1(fwts_framework *fw)
bool passed = true;
fwts_acpi_table_aspt *aspt = (fwts_acpi_table_aspt *)table->data;
- if (table->length < sizeof(fwts_acpi_table_aspt)) {
+ if (!fwts_acpi_table_length_check(fw, "ASPT", table->length, \
sizeof(fwts_acpi_table_aspt))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "ASPTTooShort",
- "ASPT table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_aspt), table->length);
goto done;
}
diff --git a/src/acpi/boot/boot.c b/src/acpi/boot/boot.c
index 1fb9d0e2..081b8b37 100644
--- a/src/acpi/boot/boot.c
+++ b/src/acpi/boot/boot.c
@@ -52,13 +52,8 @@ static int boot_test1(fwts_framework *fw)
bool passed = true;
fwts_acpi_table_boot *boot = (fwts_acpi_table_boot *)table->data;
- if (table->length < sizeof(fwts_acpi_table_boot)) {
+ if (!fwts_acpi_table_length_check(fw, "BOOT", table->length, \
sizeof(fwts_acpi_table_boot))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "BOOTTooShort",
- "BOOT table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_boot), table->length);
goto done;
}
diff --git a/src/acpi/dbg2/dbg2.c b/src/acpi/dbg2/dbg2.c
index 45eb96a8..48e82601 100644
--- a/src/acpi/dbg2/dbg2.c
+++ b/src/acpi/dbg2/dbg2.c
@@ -148,13 +148,8 @@ static int dbg2_test1(fwts_framework *fw)
size_t total_size;
/* Enough length for the initial dbg2 header? */
- if (table->length < sizeof(fwts_acpi_table_dbg2)) {
+ if (!fwts_acpi_table_length_check(fw, "DBG2", table->length, \
sizeof(fwts_acpi_table_dbg2))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "DBG2TooShort",
- "DBG2 table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_dbg2), table->length);
goto done;
}
diff --git a/src/acpi/dbgp/dbgp.c b/src/acpi/dbgp/dbgp.c
index 7e85e99b..41e6bb2b 100644
--- a/src/acpi/dbgp/dbgp.c
+++ b/src/acpi/dbgp/dbgp.c
@@ -53,13 +53,8 @@ static int dbgp_test1(fwts_framework *fw)
char *interface_type;
fwts_acpi_table_dbgp *dbgp = (fwts_acpi_table_dbgp *)table->data;
- if (table->length < sizeof(fwts_acpi_table_dbgp)) {
+ if (!fwts_acpi_table_length_check(fw, "DBGP", table->length, \
sizeof(fwts_acpi_table_dbgp))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "DBGPTooShort",
- "DBGP table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_dbgp), table->length);
goto done;
}
diff --git a/src/acpi/fpdt/fpdt.c b/src/acpi/fpdt/fpdt.c
index e15d019b..a4924e3a 100644
--- a/src/acpi/fpdt/fpdt.c
+++ b/src/acpi/fpdt/fpdt.c
@@ -80,14 +80,8 @@ static int fpdt_test1(fwts_framework *fw)
const size_t fpdt_hdr_len = sizeof(fwts_acpi_table_fpdt_header);
/* Size sanity, got enough table to get initial header */
- if (table->length < sizeof(fwts_acpi_table_header)) {
+ if (!fwts_acpi_table_length_check(fw, "FPDT", table->length, \
sizeof(fwts_acpi_table_header))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "FPDTTooShort",
- "FPDT table too short, must be at least %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_header),
- table->length);
goto done;
}
diff --git a/src/acpi/hest/hest.c b/src/acpi/hest/hest.c
index 0a3b47f5..c6da557d 100644
--- a/src/acpi/hest/hest.c
+++ b/src/acpi/hest/hest.c
@@ -801,14 +801,8 @@ static int hest_test1(fwts_framework *fw)
hest_type_02_count = 0,
hest_type_11_count = 0;
-
- if (table->length < sizeof(fwts_acpi_table_hest)) {
+ if (!fwts_acpi_table_length_check(fw, "HEST", table->length, \
sizeof(fwts_acpi_table_hest))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "HESTTooShort",
- "HEST table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_hest), table->length);
goto done;
}
diff --git a/src/acpi/mchi/mchi.c b/src/acpi/mchi/mchi.c
index d38899c9..120c6f4f 100644
--- a/src/acpi/mchi/mchi.c
+++ b/src/acpi/mchi/mchi.c
@@ -54,13 +54,8 @@ static int mchi_test1(fwts_framework *fw)
bool passed = true;
fwts_acpi_table_mchi *mchi = (fwts_acpi_table_mchi *)table->data;
- if (table->length < sizeof(fwts_acpi_table_mchi)) {
+ if (!fwts_acpi_table_length_check(fw, "MCHI", table->length, \
sizeof(fwts_acpi_table_mchi))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "MCHITooShort",
- "MCHI table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_mchi), table->length);
goto done;
}
diff --git a/src/acpi/msdm/msdm.c b/src/acpi/msdm/msdm.c
index ed476d3c..fb7bb771 100644
--- a/src/acpi/msdm/msdm.c
+++ b/src/acpi/msdm/msdm.c
@@ -55,13 +55,8 @@ static int msdm_test1(fwts_framework *fw)
bool passed = true;
/* Size sanity check #1, got enough table to get initial header */
- if (table->length < sizeof(fwts_acpi_table_msdm)) {
+ if (!fwts_acpi_table_length_check(fw, "MSDM", table->length, \
sizeof(fwts_acpi_table_msdm))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "MSDMTooShort",
- "MSDM table too short, must be at least %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_msdm), table->length);
goto done;
}
fwts_log_info_verbatim(fw, " Reserved: 0x%8.8" PRIx32, \
msdm->reserved);
diff --git a/src/acpi/slic/slic.c b/src/acpi/slic/slic.c
index 21bd7976..4c947694 100644
--- a/src/acpi/slic/slic.c
+++ b/src/acpi/slic/slic.c
@@ -59,13 +59,8 @@ static int slic_test1(fwts_framework *fw)
size_t length = slic_min_hdr_size;
/* Size sanity check #1, got enough table to get initial header */
- if (table->length < slic_min_hdr_size) {
+ if (!fwts_acpi_table_length_check(fw, "SLIC", table->length, slic_min_hdr_size)) {
passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "SLICTooShort",
- "SLIC table too short, must be at least %zu bytes, "
- "instead got %zu bytes",
- slic_min_hdr_size, table->length);
goto done;
}
ptr = (uint8_t *)table->data + sizeof(fwts_acpi_table_header);
diff --git a/src/acpi/slit/slit.c b/src/acpi/slit/slit.c
index a365cba1..ef84a807 100644
--- a/src/acpi/slit/slit.c
+++ b/src/acpi/slit/slit.c
@@ -57,13 +57,8 @@ static int slit_test1(fwts_framework *fw)
fwts_acpi_table_slit *slit = (fwts_acpi_table_slit *)table->data;
/* Size sanity check #1, got enough table to at least get matrix size */
- if (table->length < sizeof(fwts_acpi_table_slit)) {
+ if (!fwts_acpi_table_length_check(fw, "SLIT", table->length, \
sizeof(fwts_acpi_table_slit))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "SLITTooShort",
- "SLIT table too short, must be at least %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_spmi), table->length);
goto done;
}
diff --git a/src/acpi/spmi/spmi.c b/src/acpi/spmi/spmi.c
index cac580a5..5ee2d2ac 100644
--- a/src/acpi/spmi/spmi.c
+++ b/src/acpi/spmi/spmi.c
@@ -55,13 +55,8 @@ static int spmi_test1(fwts_framework *fw)
bool passed = true;
fwts_acpi_table_spmi *spmi = (fwts_acpi_table_spmi *)table->data;
- if (table->length < sizeof(fwts_acpi_table_spmi)) {
+ if (!fwts_acpi_table_length_check(fw, "SPMI", table->length, \
sizeof(fwts_acpi_table_spmi))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "SPMITooShort",
- "SPMI table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_spmi), table->length);
goto done;
}
diff --git a/src/acpi/uefi/uefi.c b/src/acpi/uefi/uefi.c
index 17779d0a..0569af3f 100644
--- a/src/acpi/uefi/uefi.c
+++ b/src/acpi/uefi/uefi.c
@@ -61,13 +61,8 @@ static int uefi_test1(fwts_framework *fw)
0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 };
/* Enough length for the uefi table? */
- if (table->length < sizeof(fwts_acpi_table_uefi)) {
+ if (!fwts_acpi_table_length_check(fw, "UEFI", table->length, \
sizeof(fwts_acpi_table_uefi))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "UEFITooShort",
- "UEFI table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_uefi), table->length);
goto done;
}
diff --git a/src/acpi/waet/waet.c b/src/acpi/waet/waet.c
index 14481f4f..81002e6a 100644
--- a/src/acpi/waet/waet.c
+++ b/src/acpi/waet/waet.c
@@ -55,13 +55,8 @@ static int waet_test1(fwts_framework *fw)
fwts_acpi_table_waet *waet = (fwts_acpi_table_waet *)table->data;
/* Enough length for the initial waet header? */
- if (table->length < sizeof(fwts_acpi_table_waet)) {
+ if (!fwts_acpi_table_length_check(fw, "WAET", table->length, \
sizeof(fwts_acpi_table_waet))) { passed = false;
- fwts_failed(fw, LOG_LEVEL_HIGH,
- "WAETTooShort",
- "WAET table too short, expecting %zu bytes, "
- "instead got %zu bytes",
- sizeof(fwts_acpi_table_waet), table->length);
goto done;
}
diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h
index 8151f76d..de51a4bc 100644
--- a/src/lib/include/fwts_acpi_tables.h
+++ b/src/lib/include/fwts_acpi_tables.h
@@ -57,6 +57,7 @@ void fwts_acpi_reserved_zero_check(fwts_framework *fw, const char \
*table, const void fwts_acpi_reserved_zero_array_check(fwts_framework *fw, const \
char *table, const char *field, uint8_t* data, uint8_t length, bool *passed); void \
fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const char \
*field, uint64_t value, uint8_t size, uint8_t min, uint8_t max, bool *passed); void \
fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, \
uint8_t min, uint8_t reserved, bool *passed); +bool \
fwts_acpi_table_length_check(fwts_framework *fw, const char *table, uint32_t length, \
uint32_t size); bool fwts_acpi_structure_length_check(fwts_framework *fw, const char \
*table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size);
uint32_t fwts_get_acpi_version(fwts_framework *fw);
diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
index 4ee7c783..88f484b7 100644
--- a/src/lib/src/fwts_acpi_tables.c
+++ b/src/lib/src/fwts_acpi_tables.c
@@ -1546,6 +1546,29 @@ void fwts_acpi_reserved_type_check(
}
}
+/*
+ * fwts_acpi_table_length_check()
+ * verify whether table length is sane
+ */
+bool fwts_acpi_table_length_check(
+ fwts_framework *fw,
+ const char *table,
+ uint32_t length,
+ uint32_t size)
+{
+ if (length < size) {
+ char label[30];
+ strncpy(label, table, 4); /* ACPI name is 4 char long */
+ strncpy(label + 4, "TooShort", sizeof(label) - 4);
+ fwts_failed(fw, LOG_LEVEL_HIGH, label,
+ "%4.4s table too short, expecting %2.2" PRIu8
+ " bytes, instead got %2.2" PRIu8 " bytes",
+ table, size, length);
+ return false;
+ }
+ return true;
+}
+
/*
* fwts_acpi_structure_length_check()
* verify whether sub structure length is sane
--
2.17.1
--
fwts-devel mailing list
fwts-devel@lists.ubuntu.com
Modify settings or unsubscribe at: \
https://lists.ubuntu.com/mailman/listinfo/fwts-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic