From 4a55e6885816aa2a45314975686356ce282cae5c Mon Sep 17 00:00:00 2001 From: Edward O'Callaghan Date: Tue, 26 Nov 2019 23:28:05 +1100 Subject: cbtable.c: Factor out lb_header_validation logic Write a pure function for the header validation logic, it is easier to unit-test. Change-Id: Ia288bcbc5c371329952a6efba30ccf0e18965a3d Signed-off-by: Edward O'Callaghan Reviewed-on: https://review.coreboot.org/c/flashrom/+/37238 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer Reviewed-by: Arthur Heymans --- cbtable.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/cbtable.c b/cbtable.c index bdf53ce38..669a4619d 100644 --- a/cbtable.c +++ b/cbtable.c @@ -151,6 +151,25 @@ static unsigned int count_lb_records(struct lb_header *head) return count; } +static int lb_header_valid(struct lb_header *head, unsigned long addr) +{ + if (memcmp(head->signature, "LBIO", 4) != 0) + return 0; + msg_pdbg("Found candidate at: %08lx-%08lx\n", + addr, addr + sizeof(*head) + head->table_bytes); + if (head->header_bytes != sizeof(*head)) { + msg_perr("Header bytes of %d are incorrect.\n", + head->header_bytes); + return 0; + } + if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) { + msg_perr("Bad header checksum.\n"); + return 0; + } + + return 1; +} + static struct lb_header *find_lb_table(void *base, unsigned long start, unsigned long end) { @@ -162,24 +181,13 @@ static struct lb_header *find_lb_table(void *base, unsigned long start, (struct lb_header *)(((char *)base) + addr); struct lb_record *recs = (struct lb_record *)(((char *)base) + addr + sizeof(*head)); - if (memcmp(head->signature, "LBIO", 4) != 0) - continue; - msg_pdbg("Found candidate at: %08lx-%08lx\n", - addr, addr + head->table_bytes); - if (head->header_bytes != sizeof(*head)) { - msg_perr("Header bytes of %d are incorrect.\n", - head->header_bytes); + if (!lb_header_valid(head, addr)) continue; - } if (count_lb_records(head) != head->table_entries) { msg_perr("Bad record count: %d.\n", head->table_entries); continue; } - if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) { - msg_perr("Bad header checksum.\n"); - continue; - } if (compute_checksum(recs, head->table_bytes) != head->table_checksum) { msg_perr("Bad table checksum: %04x.\n", -- cgit v1.2.3